4

我尝试在我们产品的一些程序集上运行 FxCop,我得到了很多匹配“指定 IFormatProvider”规则的内容。

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

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

可以写成

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

第二种变体更难阅读。

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

4

3 回答 3

6

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

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

例子:

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

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

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


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

于 2011-08-08T10:02:12.140 回答
2

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

  1. 如果该值将显示给用户,请使用当前文化。请参阅System.Globalization.CultureInfo.CurrentCulture
  2. 如果该值将由软件存储和访问(保存到文件或数据库中),请使用不变区域性。请参阅System.Globalization.CultureInfo.InvariantCulture
  3. 如果您不知道值的目的地,请让数据使用者或提供者指定文化。

PS:我相信FxCop遵循第三条规则,让您自己指定正确的文化。

于 2011-08-08T10:00:31.060 回答
1

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

于 2011-08-08T13:52:55.607 回答