2011-08-08 18 views
4

我试着在我们的产品的几个组件上运行FxCop,并且我得到了很多“指定IFormatProvider”规则的匹配。我应该总是指定使用哪一个IFormatProvider?

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

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

这可以写成

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

第二个变量是更难阅读。

那么,它实际上是否推荐总是指定IFormatProvider还是“只是”规则中启发式的限制吗?

回答

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

谢谢,这是一个明确的改进,但它不适用于我的记录器,因为界面超出了我的控制范围......而那些调用最让我恼火的是:)将此标记为正确答案,因为它到目前为止是最有用的。 –

+0

InvariantText.Format和CulturedText.Format方法返回字符串。在您的示例中,您可以将记录器方法重写为Logger.DebugFormat(CulturedText.Format(“Appending file {0}”,fileName));'。 –

+0

这实际上是一个非常好的主意。 +1。 – Joey

2

这取决于。你知道如何以及在哪里申请将被使用,所以请考虑以下MSDN建议:

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

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

1

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

+0

谢谢,关于未来维护的观点非常好。 –