.InoString中的CultureInfo.InvariantCulture()

时间:2014-06-23 08:50:50

标签: c# invariantculture

我目前正在修复FxCop问题所以我遇到了在使用ToString()转换字符串时必须提供cultureinfo的问题。

目前在我的代码中我们没有传递任何内容作为IFormatProvider所以我读了一些msdn文章说当你没有为cultureinfo传递任何值时它将分配一个默认值,当你指定CultureInfo为InvariantCulture时它将独立于任何文化。

我的问题是,“默认和CultureInfo.InvariantCulture是一样的吗?我可以将我的所有代码从默认代码替换为InvariantCulture吗?”

前:

 int st = 123;
 String s = st.ToString(123); // this will be taken as default 
 String s = st.ToString(123, CultureInfo.InvariantCulture); // culture is specified externally 

第二行和第三行是否相同?

2 个答案:

答案 0 :(得分:6)

  

默认情况下和CultureInfo.InvariantCulture是同一个吗?

不,绝对没有。 默认文化取决于(最初)操作系统设置。不变的文化意味着一个中立的"培养

123的例子并不是很好,因为大多数(所有?)文化都会用同样的方式表示整数 - 至少在你进入分组分隔符等格式之前(我不是认为 .NET在格式化整数时支持非阿拉伯数字。)

将其与格式化十进制值进行比较,例如:

decimal x = 123.45m;
Console.WriteLine(x.ToString()); // Might be 123,45
Console.WriteLine(x.ToString(CultureInfo.InvariantCulture)); // Always 123.45

如果你在(比如)法国运行上面的代码,默认文化将是法语,它使用逗号作为小数分隔符 - 所以它将打印出来" 123,45"。

要记住的经验法则是,不变文化适用于机器到机器的通信(例如,格式化JSON或XML中的值),而其他文化更适合直接向用户显示信息。

虽然默认区域性最初基于操作系统设置,但可以使用Thread.CurrentCultureThread.CurrentUICulture进行更改;后者用于查找翻译的资源,而前者用于格式化决策,如上所述。您可以在任何主题上设置这些属性,但通常您使用Thread.CurrentThread.CurrentCulture = ...

答案 1 :(得分:3)

不,他们不一样。

第一个将从计算机获取区域设置或运行应用程序线程的文化设置。

第二个将采用英语,根据MSDN

  

不变文化对文化不敏感;它与英语有关,但与任何国家/地区无关。