什么是不变文化?


173

有人可以举一个例子来说明不变文化的用法吗?我不了解文档描述的内容。


14
它是英语,但未与任何位置关联。

Answers:


133

不变文化是一种特殊的文化,因为它不会改变,因此很有用。当前的文化可以从一个用户更改为另一个用户,甚至可以从一个运行更改为另一个,因此您不能依靠它保持不变。

每次使用相同文化的能力在多个流程中非常重要,例如序列化:在一个文化中可以有1,1的值,在另一个文化中可以有1.1的值。如果您尝试在第二种区域性中解析“ 1,1”值,则解析将失败。但是,您可以使用不变区域性将数字转换为字符串,然后再从具有任何区域性集的任何计算机上解析回它。

// Use some non-invariant culture.
CultureInfo nonInvariantCulture = new CultureInfo("en-US");
Thread.CurrentThread.CurrentCulture = nonInvariantCulture;

decimal dec = 1.1m;
string convertedToString = dec.ToString();

// Simulate another culture being used,
// following code can run on another computer.
nonInvariantCulture.NumberFormat.NumberDecimalSeparator = ",";

decimal parsedDec;

try
{
    // This fails because value cannot be parsed.
    parsedDec = decimal.Parse(convertedToString);
}
catch (FormatException)
{
}

// However you always can use Invariant culture:
convertedToString = dec.ToString(CultureInfo.InvariantCulture);

// This will always work because you serialized with the same culture.
parsedDec = decimal.Parse(convertedToString, CultureInfo.InvariantCulture);

9
对于它的价值,它在System.Globalization名称空间中。
Jim H.

1
这将一直有效,因为您使用相同的文化序列化了<<这对我来说没有意义,我想我误会了一些东西。如果使用CultureInfo.InvariantCulture作品是因为您使用了相同的文化序列化...。那么这与使用作品不同CultureInfo.CurrentCulture吗?
Alisson

3
@Alisson如果将安德鲁的最后两个代码语句放回原始流程中,我认为这会更有意义。如果您始终使用CultureInfo.InvariantCulture进行序列化,那么您将始终可以使用解析回十进制CultureInfo.InvariantCulture。如果您用于CultureInfo.CurrentCulture序列化,则用户当前的文化可能是“ en-US”。下一个将其解析为十进制的用户可能具有当前使用“,”作为分隔符的区域性。
David Specht

1
@安德鲁(Andrew)也许我很稠密,但没有大卫的评论,我听不懂你在说什么。我对您的答案进行了明确的编辑。
jpaugh

113

一种基于英语的假文化,具有明确的行为。例如,将内容填充到配置文件中非常好,因此无论用户定义的区域性如何,都可以对其进行读写。

基本上,这是一种人造的特定文化,不会改变


4
具体来说,您不会被逗号或数字字符串形式的点的不同用法或奇数大小写转换所吸引。
史蒂夫·吉勒姆

8
是的...的典型问题是:*认为单词是英语的美国程序员;)然后,德国客户以1000的价格写1.000,00;)哎呀。*即使使用相同的语言,瑞士和德国也使用“”。和“,”以不同的方式表示数字。结果->配置文件是垃圾。在那儿使用不变语言;)
TomTom 2010年

23
要添加到史蒂夫的评论中:当您实际上并不关心事物的外观时,它是一种使用的文化(您不在乎它是使用逗号还是点数,因为用户永远不会看到它),但是您始终需要它保持一致(例如,因为您需要能够阅读所写内容)。
itowlson

7

无论什么文化,它都用于相同的东西(不需要翻译成适当的X文化)

例如-https://msdn.microsoft.com/zh-cn/library/4c5zdc6a(v=vs.100).aspx。当写出用户不应该与之混为一谈的特定于应用程序的文件时,应该对所有采用区域性参数的方法都使用InvariantCulture。

请注意,根据上面链接的文档:

但是,应用程序应仅将不变性区域性用于要求与区域性无关的结果的过程,例如格式化和解析持久化到文件的数据。


3
这说明必然文化仅是一种中间格式,即,如果您向用户显示不变文化的输出内容(即“在不变文化中”),则您在做出了点问题并且不了解不变的文化。
mlhDev

3

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

CultureInfo.InvariantCulture检索不变区域性的实例。几乎可以在需要文化的System.Globalization命名空间中的任何方法中使用它。

由诸如CompareInfo,DateTimeFormat和NumberFormat之类的属性返回的对象还反映了不变区域性的字符串比较和格式约定。当您要以与区域性无关的格式显示持久数据时,InvariantCulture属性将很方便。

例如,如果要以特定格式显示数字或日期时间,而不依赖于应用程序的当前区域性,则可以使用CultureInfo.InvariantCulture


0

它是一种通用的,非区域特定的通用英语语言和其他相关信息。就像编程语言本身的语言一样。您可以依靠它来设置通用日历;在需要生成控制器名称,URL,代表名称等的情况下。并且需要让所有用户自然而普遍地采取行动。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.