在String.Format()中,CultureInfo.CurrentCulture是否真的必要?

32

你认为在String.Format(string, object)方法中提供IFormatProvider是否真的必要?

写全变体更好吗?

String.Format(CultureInfo.CurrentCulture, "String is {0}", str);

或者只是
String.Format("String is {0}", str);

?

4个回答

34

通常情况下,如果你生成的字符串需要以独立于当前用户文化的方式进行持久化(如在注册表或文件中),则应使用InvariantCulture。

如果要向当前用户呈现字符串(如表单、报告),则应使用CurrentCulture。

如果在应该使用InvariantCulture的地方使用CurrentCulture,则可能会出现微妙的错误:只有当多个具有不同文化的用户访问相同的注册表项或文件时,或者用户更改默认文化时才会暴露这些错误。

明确指定CurrentCulture(如果省略IFormatProvider参数,则为默认值)实际上是一种文档记录,它表明你已经考虑过上述问题,并且正在生成的字符串应该使用当前用户的文化。这就是为什么FxCop建议你应该指定IFormatProvider参数的原因。


22
如果您没有指定IFormatProvider(或等效地传递null),大多数参数类型最终将按照CultureInfo.CurrentCulture进行格式化。有趣的是,您可以指定自定义的IFormatProvider来优先处理格式化参数,或根据其他上下文覆盖格式化区域设置。
请注意,CultureInfo.CurrentCulture会影响参数格式化,而不是资源选择;资源选择由CultureInfo.CurrentUICulture控制。

2
如何定义自定义的IFormatProvider - http://www.csharp-examples.net/custom-iformatprovider/ - Martin Konicek
2
如果对象是一个字符串,文化是否会有所不同?(与格式化DateTime等内容相反) - Joe Cartano
@JoeCartano 我认为不是。只适用于存在非字符串(必须以特定文本格式进行_格式化_)的情况。 - nawfal

7
不需要指定文化,除非您的字符串包含特定于文化的元素,例如小数分隔符、货币等,这些元素必须根据文化进行呈现。

4

如果您关心应用的本地化(全球化),那么它将特别有用,尤其是在涉及IT技术方面。也就是说,如果您希望您的应用程序支持多种语言和文化特定格式,那么您应该使用它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接