我应该总是指定使用哪个IFormatProvider吗?

时间:2011-08-08 09:46:42

标签: .net fxcop iformatprovider

我尝试在我们产品的几个程序集上运行FxCop,并且我获得了许多“指定IFormatProvider”规则的匹配。

碰巧,其中一些是合法的,但它也匹配这样的代码:

Logger.DebugFormat("Appending file {0}", fileName);

可以写成

Logger.DebugFormat(CultureInfo.InvariantCulture, "Appending file {0}", fileName);

第二种变体更难阅读。

那么,实际上是否建议总是指定IFormatProvider,或者它只是“仅仅”规则中使用的启发式限制?

3 个答案:

答案 0 :(得分:6)

它仅适用于IFormatProvider重载的方法。

为了解决这个问题,我有两个静态类InvariantTextCulturedText,分别用于不变文化和当前文化中的字符串。例如,我在每个类中都有一个Format方法。通过这种方式,我可以进行文化中立和文化感知格式化,而无需每次都指定IFormatProvider

示例:

InvariantText.Format("0x{0:X8}",value);

CulturedText.Format("Appending file {0}",file);

InvariantText.FormatCulturedText.Format只是String.Format方法的包装器,因此同样返回字符串。


您甚至可以使用此模式来包装需要文化中性和特定于文化的字符串的其他函数。例如,创建两个方法InvariantLogCulturedLog,在您的问题中包含对Logger.DebugFormat的调用,并在每种情况下采用相应的IFormatProvider

答案 1 :(得分:2)

这取决于。您知道应用程序的使用方式和位置,因此请考虑遵循MSDN建议:

  1. 如果该值将显示给用户,请使用当前文化。见System.Globalization.CultureInfo.CurrentCulture
  2. 如果该值将由软件存储和访问(持久保存到文件或数据库),请使用不变文化。见System.Globalization.CultureInfo.InvariantCulture
  3. 如果您不知道值的目的地,请让数据使用者或提供者指定文化。
  4. PS:我相信FxCop遵循第三条规则,让您自己指定正确的文化。

答案 2 :(得分:1)

规则不是代码的唯一读者。如果您没有明确指定格式化文化,维护开发人员将无法区分故意回退到默认格式文化(大多数情况下为CurrentCulture)或可能导致格式错误的遗漏。如果您不喜欢详细程度,请考虑使用Peter O提出的包装方法。