我目前正在修复FxCop问题,因此我遇到了问题,在使用ToString()转换字符串时必须提供区域性信息。
目前,在我的代码中,nothing是作为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 第二行和第三行相等吗?
发布于 2014-06-23 08:54:28
默认值和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-23 08:53:29
不,他们不一样。
第一个将从计算机获取区域设置或从正在运行的应用程序线程获取区域性设置。
根据MSDN的说法,第二种语言是英语。
不变的文化是对文化不敏感的;它与英语有关,但与任何国家/地区无关。
https://stackoverflow.com/questions/24361833
复制相似问题