InvariantCulture是什么意思?

3
我知道关于日期/数字的文化规则足以写一本书,但我认为我有一个简单的问题..
使用InvariantCulture是否基本上意味着您明确定义值(日期/数字/任何其他)将作为何种文化输入/显示?并且它会覆盖任何其他文化设置(例如用户代理的设置)?
如果应用程序面向一个特定文化的受众,那么每次都使用InvariantCulture并定义您想要的值输入/显示方式是否有意义?

2
使用InvariantCulture以确保行为在系统的文化设置不同的情况下保持一致。 - Sayse
1
这对我来说是一个非常令人困惑的话题。我阅读的每篇MSDN文档都让我更加困惑,因此需要“简明英语”。但还是谢谢 - 我已经阅读了。 - notAnonymousAnymore
1
InvariantCulture 是“普通英语”文化。 - Hans Passant
你也可以查看这个链接:什么是不变文化 - nawfal
3个回答

9
使用InvariantCulture基本上意味着您明确定义值(日期/数字/其他)将作为何种文化输入/显示,对吗?
不是。它只是一种类似于美式英语的文化,除货币标志等少数内容外。通常用于格式化/使用其他计算机理解或生成的文本,而非人类。
如果应用程序针对仅一个文化受众构建,那么使用InvariantCulture并每次都定义您要如何输入/显示值是否有意义?
不是。您会使用相应的CultureInfo来针对该文化使用。您还可以明确定义日期等格式,但这是一种正交考虑。最好使用该文化的预定义标准格式之一,但如果没有符合您需求的格式,则始终可以明确说明。

啊,好的。所以使用相关的CultureInfo,然后在需要时明确覆盖它?感谢您的回答。 - notAnonymousAnymore
@user982119:你不需要覆盖文化,只需要在必要的时候明确指定格式。你知道可以同时指定两者,对吧? - Jon Skeet
你能给我一个例子吗?说明同时指定两者的情况何时是必要/有用的。 - notAnonymousAnymore
@user982119:当然 - 假设你想要指定“以这种文化方式格式化日期的星期几”,你可以使用 dateTime.ToString("dddd dd MMMM yyyy", someCulture) - Jon Skeet

6

InvariantCulture是与任何文化或因素无关的。例如,如果您使用新的CultureInfo("en-US"),它将获取您的美国英语Culture(这可能并不是真正的美国英语Culture,因为操作系统在控制面板中提供了更改这些设置的选项),如果应用于其任何自定义格式,则会返回“en-US”的Culture的修改版本。

换句话说,InvariantCulture始终会给您一个在系统之间永远不会改变的Culture。


假设您想要序列化某个值(如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);

数字更重要,对吧?考虑这个字符串表示的是“账户余额”吗?
希望这有所帮助。

因此,InvariantCulture 给您更多控制?尽管不允许用户决定有点侵入性。 - notAnonymousAnymore
没错。不变的文化无法更改。因此,用户无法决定。 - Sriram Sakthivel

5
关于 DateTime,我能给的最好建议是在你有确切格式时使用 CultureInfo.InvariantCulture 进行 ParseExactToString。 (如果你碰巧知道你的输入格式与固定区域设置的格式匹配,也可以在 Parse 中使用它,但我通常会避免这样做。)
与用户交互时不要使用固定区域设置。
请记住,区域设置包含多个项目,包括日/月/年部分的排序、日期和时间部分分隔符字符、字符编码以及星期几、月份和缩写(包括上午/下午)的语言特定名称。
以下是一些应该使用固定区域设置的示例:
  • 磁盘上的文件,特别是预定义格式的文本文件
  • 外部 API,特别是 JSON 或 XML
  • 单元测试,除非你专门测试区域设置问题
以下是应该使用特定区域设置(例如 en-US)的示例:
  • 用户界面
  • 报告

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接