我应该始终指定要使用哪个 IFormatProvider 吗?

Posted

技术标签:

【中文标题】我应该始终指定要使用哪个 IFormatProvider 吗?【英文标题】:Should I always specify which IFormatProvider to use? 【发布时间】:2011-08-08 09:46:41 【问题描述】:

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

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

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

可以写成

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

第二种变体更难阅读。

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

【问题讨论】:

【参考方案1】:

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

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

例子:

InvariantText.Format("0x0:X8",value);

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

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


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

【讨论】:

谢谢,这是一个明确的改进,但它对我的记录器不起作用,因为界面超出了我的控制......而这些调用是最让我恼火的 :) 标记这个作为正确答案,因为它确实是迄今为止最有用的答案。 InvariantText.Format 和 CulturedText.Format 方法返回字符串。在您的示例中,您可以将记录器方法重写为Logger.DebugFormat(CulturedText.Format("Appending file 0", fileName)); 这实际上是一个非常好的主意。 +1。 @Peter,是的,这将是一种方式。它最终的字符数量大致相同,但更具可读性。【参考方案2】:

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

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

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

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于我应该始终指定要使用哪个 IFormatProvider 吗?的主要内容,如果未能解决你的问题,请参考以下文章

Java 对象 始终要覆盖toString

如何知道应该使用哪个 cuDNN 版本?

Jquery PrettyPhoto - 如何始终显示下一个上一个按钮?

如何指定我的 .NET 互操作应该使用哪个 COM 服务器?

如何指定哪个python版本的诗歌应该创建venv?

如何指定 Django 测试服务器应该监听哪个 eth 接口?