我试着在我们产品的几个组件上运行FxCop,我得到了很多很多的"Specify IFormatProvider"规则的匹配。
实际上,其中一些是合法的,但它也匹配如下代码:
Logger.DebugFormat("Appending file {0}", fileName);
可以写成
Logger.DebugFormat(CultureInfo.InvariantCulture, "Appending file {0}", fileName);
第二个变体更难读。
那么,实际上是建议总是指定IFormatProvider
,还是"只是"规则中使用的启发式的限制? 只适用于IFormatProvider
重载的方法。
为了处理这个问题,我有两个静态类InvariantText
和CulturedText
,它们分别处理不变区域性和当前区域性中的字符串。例如,我在每个类中都有一个Format方法。这样,我就可以进行与区域性无关和区域性相关的格式化,而不必每次都指定IFormatProvider
。
的例子:
InvariantText.Format("0x{0:X8}",value);
CulturedText.Format("Appending file {0}",file);
InvariantText.Format
和CulturedText.Format
只是String.Format
方法的包装,因此同样返回字符串。
您甚至可以使用此模式包装其他需要区域性无关和区域性特定字符串的函数。例如,创建两个方法,InvariantLog
和CulturedLog
,它们在问题中包装对Logger.DebugFormat
的调用,并在每种情况下采用适当的IFormatProvider
。
看情况。您知道应用程序将如何以及在何处使用,因此请考虑以下MSDN建议:
- 如果该值将显示给用户,则使用当前区域性。看到System.Globalization.CultureInfo.CurrentCulture。
- 如果该值将由软件存储和访问(持久化到文件或数据库),则使用不变区域性。看到System.Globalization.CultureInfo.InvariantCulture。
- 如果不知道值的目的地,请让数据使用者或提供者指定区域性。
PS:我相信FxCop
遵循了第三条规则,让你自己指定正确的文化。
规则并不是您代码的唯一读者。如果没有显式指定格式区域性,维护开发人员将无法区分是故意回退到默认格式区域性(大多数情况下为CurrentCulture),还是可能导致格式错误的遗漏。如果不喜欢冗长,可以考虑使用Peter O.建议的包装器方法。