什么是不变文化?

186

有没有人能给出一个示例来演示使用不变性文化的用法?我不理解文档描述的内容。

5个回答

145

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

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

10
这是 System.Globalization 命名空间中的一部分,就此而言值得一提。 - Jim H.
1
这将始终有效,因为您使用相同的区域设置进行序列化。<< 这句话对我来说没有意义,我想我误解了什么。如果使用CultureInfo.InvariantCulture可以正常工作是因为您使用相同的区域设置进行序列化...那么使用CultureInfo.CurrentCulture不就是一样的吗? - Alisson Reinaldo Silva
3
如果你将安德鲁最后两行代码放回原始流程,我认为它会更有意义。如果你总是使用 CultureInfo.InvariantCulture 进行序列化,那么你知道始终可以使用 CultureInfo.InvariantCulture 进行解析为十进制数。如果你使用 CultureInfo.CurrentCulture 进行序列化,你的用户可能将"en-US"作为当前文化。下一个尝试将其解析为十进制数的用户可能具有使用“,”作为分隔符的当前文化。 - David Specht
2
@Andrew 也许我很愚钝,但在没有David的评论的情况下,我无法理解你说的话。我编辑了你的答案以使之更明确。 - jpaugh

119

一种基于英语的虚假文化,有着明确定义的行为。非常适合写入配置文件,这样可以在用户定义的文化环境下读取和写入。

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


4
具体而言,您不会因数字字符串中逗号和点的不同使用或奇怪的大小写转换而感到困惑。 - Steve Gilham
8
是的...这是典型问题:
  • 美国程序员认为该单词是英语;) 然后德国客户会写1.000,00表示1000;) 真让人受不了。
  • 即使在同一种语言中,例如瑞士和德国在数字中使用 "." 和 "," 的方式也不同。 结果->配置文件是垃圾。
请使用固定语言; )
- TomTom
24
补充史蒂夫的评论:该文化是在你实际上不关心事物的外观时使用的(你不关心它是否使用逗号或点或其他任何符号,因为用户永远不会看到它),但你确实需要它始终保持相同的(例如,因为你需要能够阅读你所写的内容)。 - itowlson

8

它用于与文化无关的内容(不需要翻译成某种文化X才合适)

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

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

然而,应用程序只应在需要文化无关结果的进程中使用不变的文化,例如格式化和解析持久化到文件中的数据。


3
这表明了一个附带条件,即不变文化只是一种中间格式,也就是说,如果你向用户显示的内容是不变文化的输出(也就是“在”不变文化中),那么你正在做错事情,而且不理解不变文化。 - mlhDev

3

不变文化是一种与语言相关,但不与任何国家/地区相关的文化。

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

由CompareInfo、DateTimeFormat和NumberFormat等属性返回的对象还反映了不变文化的字符串比较和格式约定。当您想以与文化无关的格式显示持久数据时,InvariantCulture属性非常方便。

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


0

这是一种通用的简单的非地区特定的英语语言及其他相关信息。它就像编程语言本身的语言。您可以在设置通用日历时依赖它,在需要生成控制器名称、URL、委托名称等情况下,需要让所有用户自然而然地使用。


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