我尝试在我们产品的一些程序集上运行FxCop,并且获得了“ Specify IFormatProvider”规则的大量匹配项。

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

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


可以写成

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


第二种变体很难阅读。

因此,实际上是建议始终指定IFormatProvider还是“仅”限制规则中使用的启发式方法?

最佳答案

它仅适用于具有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

08-17 19:28