我试着在我们产品的几个程序集上运行FxCop,并且得到了很多“指定IFormatProvider”规则的匹配。
碰巧,其中一些是合法的,但它也匹配如下代码:
Logger.DebugFormat("Appending file {0}", fileName);它可以写成
Logger.DebugFormat(CultureInfo.InvariantCulture, "Appending file {0}", fileName);第二个变体很难读懂。
那么,它实际上是建议始终指定IFormatProvider,还是“只是”规则中使用的启发式的限制?
发布于 2011-08-08 10:02:12
它只适用于具有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。
发布于 2011-08-08 10:00:31
那得看情况。您知道将以何种方式和在何处使用应用程序,因此请考虑遵循MSDN建议:
PS:我相信FxCop遵循第三条规则,让你自己指定正确的文化。
发布于 2011-08-08 13:52:55
这条规则并不是您的代码的唯一读者。如果没有显式指定格式区域性,维护开发人员将无法区分对默认格式区域性的故意倒退(大多数情况下是CurrentCulture)还是可能导致不正确格式设置的遗漏。如果您不喜欢冗长,请考虑使用包装方法,如Peter .
https://stackoverflow.com/questions/6980309
复制相似问题