我尝试在我们产品的几个程序集上运行FxCop,并且我获得了许多“指定IFormatProvider”规则的匹配。
碰巧,其中一些是合法的,但它也匹配这样的代码:
Logger.DebugFormat("Appending file {0}", fileName);
可以写成
Logger.DebugFormat(CultureInfo.InvariantCulture, "Appending file {0}", fileName);
第二种变体更难阅读。
那么,实际上是否建议总是指定IFormatProvider
,或者它只是“仅仅”规则中使用的启发式限制?
答案 0 :(得分:6)
它仅适用于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
。
答案 1 :(得分:2)
这取决于。您知道应用程序的使用方式和位置,因此请考虑遵循MSDN建议:
PS:我相信FxCop
遵循第三条规则,让您自己指定正确的文化。
答案 2 :(得分:1)
规则不是代码的唯一读者。如果您没有明确指定格式化文化,维护开发人员将无法区分故意回退到默认格式文化(大多数情况下为CurrentCulture)或可能导致格式错误的遗漏。如果您不喜欢详细程度,请考虑使用Peter O提出的包装方法。