C# FxCop CA1305:CurrentCulture与CurrentUICulture

C# FxCop CA1305:CurrentCulture与CurrentUICulture,c#,cultureinfo,string-formatting,currentculture,currentuiculture,C#,Cultureinfo,String Formatting,Currentculture,Currentuiculture,所以,我有一些本地化的资源文件。它们是可以格式化的字符串 例如: MyResource.resx Title: "MyApp - Ver: {0}" 然后,我通过这样做返回: public String Title { get { return String.Format(CultureInfo.CurrentUICulture, MyResources.Title, 1); } } 我理解CurrentUICulture和CurrentCulture之间的区别,但FxCop告诉我

所以,我有一些本地化的资源文件。它们是可以格式化的字符串

例如:

MyResource.resx
 Title: "MyApp - Ver: {0}"
然后,我通过这样做返回:

public String Title
{
    get { return String.Format(CultureInfo.CurrentUICulture, MyResources.Title, 1); }
}

我理解CurrentUICulture和CurrentCulture之间的区别,但FxCop告诉我改用CurrentCulture?

字符串。格式通常用于数字或日期格式,这是基于
CurrentCulture
而不是
CurrentUICulture

的另一件事是
CurrentUICulture
可以是中性文化,而
CurrentCulture
始终是特定文化


XXXFormatInfo
类型不适用于中性区域性,将引发
NotSupportedException
异常。

在某种程度上,FxCop是正确的:在这种情况下,不应使用
CurrentUICulture
。正如其他人已经说过的,
CurrentCulture
用于区域设置感知格式,而
CurrentUICulture
用于从资源中读取可翻译字符串。
您在这里所做的是格式化数字,因此FxCop抱怨您使用了不正确的
CultureInfo
。不幸的是,FxCop没有告诉您的是,您实际上应该使用
CultureInfo.InvariantCulture
。为什么?因为版本号不依赖于语言环境。你总是会看到像1.9这样的东西,而不是像1,9这样的东西。因此,
InvariantCulture
是一条出路。
微软甚至提供了特定的类来存储版本信息——奇怪的是,它的名称是
version
(它位于
System
命名空间中)。当您执行
ToString()
时,它将始终显示我前面提到的版本号。它的构造函数在实例化时还需要区域设置不变的版本字符串