什么是不变文化?

Posted

技术标签:

【中文标题】什么是不变文化?【英文标题】:What is the Invariant Culture? 【发布时间】:2011-01-26 06:33:51 【问题描述】:

谁能举例说明Invariant Culture 的用法?我不明白文档描述的内容。

【问题讨论】:

【参考方案1】:

不变的文化是一种特殊的文化,它是有用的,因为它不会改变。当前的文化可能会从一个用户变为另一个用户,甚至从一个跑步到另一个,所以你不能指望它保持不变。

每次能够使用相同的文化在多个流程中非常重要,例如,序列化:您可以在一种文化中拥有 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);

【讨论】:

值得一提的是,它位于System.Globalization 命名空间中。 这将始终有效,因为您使用相同的文化进行连载 CultureInfo.InvariantCulture 有效是因为您使用相同的文化进行序列化....那么它与使用 CultureInfo.CurrentCulture 不一样吗? @Alisson 如果将 Andrew 的最后两个代码语句放回原始流程中,我认为它会更有意义。如果您总是使用CultureInfo.InvariantCulture 进行序列化,那么您知道您将始终能够使用CultureInfo.InvariantCulture 解析回小数。如果您使用CultureInfo.CurrentCulture 进行序列化,您的用户可能将“en-US”作为他们当前的文化。下一个将其解析回小数的用户可能具有使用“,”作为分隔符的当前文化。 @Andrew 也许我很密集,但如果没有大卫的评论,我无法理解你在说什么。我将您的答案编辑为明确的。【参考方案2】:

一种基于英语并具有明确行为的虚假文化。例如,将内容写入配置文件非常好,这样无论用户定义的文化如何,都可以对其进行读写。

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

【讨论】:

具体来说,您不会被数字字符串形式中逗号和点的不同用法或奇数大小写转换所迷惑。 Yesss... 典型问题: * 美国程序员认为这个词是英语 ;) 然后德国客户写 1.000,00 代表 1000 ;) 哎哟。 * 即使在同一种语言中,例如瑞士和德国也使用“.”。和“,”在数字上的不同方式。结果 -> 配置文件是垃圾。在那里使用不变语言;) 补充史蒂夫的评论:当您实际上并不关心事物 看起来如何(您不在乎它是否使用逗号或点或其他任何东西)时,这是使用的文化,因为用户永远不会看到它)但您确实需要它始终保持不变(例如,因为您需要能够阅读您所写的内容)。【参考方案3】:

它用于无论文化如何都相同的东西(不需要翻译成某种文化 X 就可以了)

例如 - https://msdn.microsoft.com/en-us/library/4c5zdc6a(v=vs.100).aspx。当你写出一个用户不应该乱搞的特定于应用程序的文件时,你应该对所有接受文化参数的方法使用 InvariantCulture。

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

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

【讨论】:

这说明不变文化只是一种中间格式,即如果您向用户显示作为不变文化输出的内容(即“在”不变的文化),你做错了什么,不了解不变的文化。【参考方案4】:

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

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

CompareInfo、DateTimeFormat 和 NumberFormat 等属性返回的对象也反映了不变区域性的字符串比较和格式化约定。 当您想以 文化无关 格式显示 持久数据 时,InvariantCulture 属性会派上用场。

例如,如果您想以独立于应用程序当前文化的特定格式显示数字或日期时间,您可以使用CultureInfo.InvariantCulture。

【讨论】:

【参考方案5】:

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

【讨论】:

以上是关于什么是不变文化?的主要内容,如果未能解决你的问题,请参考以下文章

文化不变对象 ToString()

mvc 3 设置当前文化不变量

具有不变文化的反序列化十进制

序列化\反序列化 - 我应该使用不变的文化信息还是保留当前的文化信息

csharp 不变文化

什么是 LCID 127?