【问题标题】:FxCop CA1305: CurrentCulture vs. CurrentUICultureFxCop CA1305:CurrentCulture 与 CurrentUICulture
【发布时间】:2011-07-22 20:43:09
【问题描述】:
所以,我有一些本地化资源文件。它们是可以格式化的字符串。
例如:
MyResource.resx
Title: "MyApp - Ver: {0}"
然后我这样做返回它:
public String Title
{
get { return String.Format(CultureInfo.CurrentUICulture, MyResources.Title, 1); }
}
我了解 CurrentUICulture 和 CurrentCulture 之间的区别,但 FxCop 告诉我改用 CurrentCulture?
【问题讨论】:
标签:
c#
cultureinfo
string-formatting
currentculture
currentuiculture
【解决方案1】:
在某种程度上 FxCop 是对的:在这种情况下你不应该使用CurrentUICulture。正如其他人已经说过的,CurrentCulture 用于支持区域设置的格式,而CurrentUICulture 用于从资源中读取可翻译的字符串。
您在这里所做的是格式化数字,因此 FxCop 抱怨您使用了不正确的 CultureInfo。不幸的是,FxCop 没有告诉你的是,你实际上应该使用CultureInfo.InvariantCulture。为什么?因为版本号不依赖于语言环境。您将始终看到类似 1.9 的内容,而不是类似 1,9 的内容。因此InvariantCulture 是要走的路。
微软甚至提供了特定的类来存储版本信息——奇怪的是它的名字是Version(AFAIR 它在System 命名空间中)。当您执行ToString() 时,这将始终向您显示我之前提到的版本号。当您实例化它时,它的构造函数还需要 Locale-invariant 版本字符串。
【解决方案2】:
String.Format 通常用于数字或日期格式,它基于CurrentCulture 而不是CurrentUICulture。
【解决方案3】:
另一件事是CurrentUICulture 可以是中性文化,而CurrentCulture 始终是特定文化。
XXXFormatInfo 类型不适用于中立文化,并会引发 NotSupportedException 异常。