我目前正在修复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
第二行和第三行是否相同?
答案 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.CurrentCulture
和Thread.CurrentUICulture
进行更改;后者用于查找翻译的资源,而前者用于格式化决策,如上所述。您可以在任何主题上设置这些属性,但通常您使用Thread.CurrentThread.CurrentCulture = ...
答案 1 :(得分:3)