所以,我有一些用于本地化的资源文件。它们是可以格式化的字符串。
例如:
MyResource.resx
Title: "MyApp - Ver: {0}"
然后通过这样做返回它:
public String Title
{
get { return String.Format(CultureInfo.CurrentUICulture, MyResources.Title, 1); }
}
我理解CurrentUICulture和CurrentCulture之间的区别,但FxCop告诉我改为使用CurrentCulture吗?
答案 0 :(得分:7)
在某种程度上,FxCop是对的:在这种情况下你不应该使用CurrentUICulture
。正如其他人已经说过的那样,CurrentCulture
用于区域设置感知格式,而CurrentUICulture
用于从资源中读取可翻译字符串。
你在这里做的是格式化数字,因此FxCop抱怨你使用了不正确的CultureInfo
。不幸的是,FxCop没有告诉你的是,你实际上应该使用CultureInfo.InvariantCulture
。为什么?因为版本号不依赖于Locale。你总会看到像1.9这样的东西,而不是1,9。因此,InvariantCulture
是要走的路
Microsoft甚至提供了特定的类来存储版本信息 - 奇怪的是它的名称是Version
(AFAIR它在System
命名空间中)。当你执行ToString()
时,这将始终显示我之前提到的版本号。它的构造函数在实例化时也需要Locale-invariant版本字符串。
答案 1 :(得分:5)
String.Format
通常用于数字或日期格式设置,它基于CurrentCulture
而不是CurrentUICulture
。
答案 2 :(得分:3)
另一件事是CurrentUICulture
可以是一种中立文化,而CurrentCulture
始终是一种特定的文化。
XXXFormatInfo
类型不适用于中性文化,并会引发NotSupportedException
例外。