首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我应该始终指定要使用哪个IFormatProvider吗?

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

Stack Overflow用户
提问于 2011-08-08 09:46:41
回答 3查看 6.6K关注 0票数 5

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

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

代码语言:javascript
复制
Logger.DebugFormat("Appending file {0}", fileName);

它可以写成

代码语言:javascript
复制
Logger.DebugFormat(CultureInfo.InvariantCulture, "Appending file {0}", fileName);

第二个变体很难读懂。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-08-08 10:02:12

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

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

示例:

代码语言:javascript
复制
InvariantText.Format("0x{0:X8}",value);

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

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

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

票数 6
EN

Stack Overflow用户

发布于 2011-08-08 10:00:31

那得看情况。您知道将以何种方式和在何处使用应用程序,因此请考虑遵循MSDN建议:

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

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

票数 2
EN

Stack Overflow用户

发布于 2011-08-08 13:52:55

这条规则并不是您的代码的唯一读者。如果没有显式指定格式区域性,维护开发人员将无法区分对默认格式区域性的故意倒退(大多数情况下是CurrentCulture)还是可能导致不正确格式设置的遗漏。如果您不喜欢冗长,请考虑使用包装方法,如Peter .

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6980309

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档