8

我目前正在修复 FxCop 问题,因此在使用ToString().

目前在我的代码中,我们没有将任何内容作为 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 

第二行和第三行是等价的吗?

4

2 回答 2

18

default 和 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.CurrentCulture和进行更改Thread.CurrentUICulture;后者用于查找已翻译的资源,而前者用于格式化上述决策。您可以在任何线程上设置这些属性,但通常您会使用Thread.CurrentThread.CurrentCulture = ...

于 2014-06-23T08:54:28.920 回答
3

不,它们不一样。

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

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

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

于 2014-06-23T08:53:29.947 回答