CultureInfo.InvariantCulture in plain english

use*_*119 2 c# culture datetime cultureinfo

我知道日期/数字的文化规则对于整本书来说已经足够了,我想我有一个简单的问题.

使用InvariantCulture是否基本上意味着您明确定义将输入/显示的值(日期/数字/等)的文化?它会覆盖任何其他文化设置(例如用户代理的设置)?

如果应用程序是为一个且只有一种文化的受众构建的,那么使用InvariantCulture并定义每次输入/显示值的方式是否合理?

Jon*_*eet 8

使用InvariantCulture是否基本上意味着您明确定义将输入/显示的值(日期/数字/等)的文化?

不,这只是一种有点像美国英语的文化,除了像货币符号这样的东西.它通常用于格式化/使用要被其他计算机而不是人类理解或生成的文本.

如果应用程序是为一个且只有一种文化的受众构建的,那么使用InvariantCulture并定义每次输入/显示值的方式是否合理?

不,你会使用相关CultureInfo的文化.您可能还明确定义日期等格式,但这是一个正交关注.最好使用该文化的预定义标准格式之一,但如果没有一种满足您的需求,您可以始终明确.


Sri*_*vel 5

InvariantCulture独立的任何文化或任何因素.例如,如果您正在使用新的CultureInfo("en-US"),它将为您提供美国英语文化(这可能不是实际的,US English Culture因为操作系统为您提供了在控制面板中更改这些设置的选项)它将返回文化的修改版本"en-US"如果应用了任何自定义格式.

换句话说,InvariantCulture总会给你一个永远不会跨系统改变的文化.


假设你想序列化一些值(比如说double)并传递给另一个应用程序或者在不同文化中运行的其他一些线程会导致严重的问题.

请考虑以下代码

Thread.CurrentThread.CurrentCulture = new CultureInfo("fr");
double source = 455.62d;
string serialized = source.ToString();//455,62 since `, is the decimal seperator` in "fr"

Thread t = new Thread((x) =>
{
    double deserialized = double.Parse(((string)x));
    Console.WriteLine(string.Format("Deserialized value is {0}", deserialized));//outputs 45562 
});
t.CurrentCulture = new CultureInfo("en-US");
t.Start(serialized);
Run Code Online (Sandbox Code Playgroud)

数字更重要吗?考虑这个字符串表示AccountBalance

希望这可以帮助


Mat*_*int 5

具体到DateTime,我能给的最好的建议是使用CultureInfo.InvariantCultureParseExactToString当你心里有一个确切的格式。(Parse如果您碰巧知道您的输入格式与不变文化的格式相匹配,您也可以使用它,但我通常会避免这种情况。)

与用户交互时不要使用固定区域性。

请记住,区域性包含多个项目,包括日/月/年部分的顺序、日期和时间部分分隔符、字符编码以及一周中的几天、一年中的几个月的特定语言名称,以及缩写,包括 am/pm。

何时应该使用不变区域性的一些示例:

  • 磁盘上的文件,尤其是预定义格式的文本文件
  • 外部 API,尤其是 JSON 或 XML
  • 单元测试,除非您专门测试文化问题

何时应该使用特定文化的一些示例,例如en-US

  • 用户界面
  • 报告