我有一个这样的文本字符串:

var foo = "FooBar";

我想声明一个名为bar的第二个字符串,并使它等于第一个foo的第一个和第四个字符,所以我这样做:

var bar = foo[0].ToString() + foo[3].ToString();

这是预期的工作,但ReSharper建议我把文化。在我的括号内的InvariantCulture,所以这一行结束如下:

var bar = foo[0].ToString(CultureInfo.InvariantCulture)
        + foo[3].ToString(CultureInfo.InvariantCulture);

这意味着什么,它会影响程序的运行吗?


当前回答

微软表示:

CultureInfo。不变文化属性既不是中性属性也不是 特定的文化。这就是第三种文化 culture-insensitive。它与英语有关,但是 不是一个国家或地区。

(从http://msdn.microsoft.com/en-us/library/4c5zdc6a (vs.71) . aspx)

因此,不变文化与“en-US”文化相似,但并不完全相同。如果你这样写:

var d = DateTime.Now;
var s1 = d.ToString(CultureInfo.InvariantCulture);   // "05/21/2014 22:09:28"
var s2 = d.ToString(new CultureInfo("en-US"));       // "5/21/2014 10:09:28 PM"

那么s1和s2将具有类似的格式,但InvariantCulture添加前导零,而“en-US”使用AM或PM。

因此,当你将日期保存到文本文件或解析数据时,InvariantCulture更适合内部使用。当您向最终用户显示数据(日期、货币……)时,指定的CultureInfo会更好。

其他回答

微软表示:

CultureInfo。不变文化属性既不是中性属性也不是 特定的文化。这就是第三种文化 culture-insensitive。它与英语有关,但是 不是一个国家或地区。

(从http://msdn.microsoft.com/en-us/library/4c5zdc6a (vs.71) . aspx)

因此,不变文化与“en-US”文化相似,但并不完全相同。如果你这样写:

var d = DateTime.Now;
var s1 = d.ToString(CultureInfo.InvariantCulture);   // "05/21/2014 22:09:28"
var s2 = d.ToString(new CultureInfo("en-US"));       // "5/21/2014 10:09:28 PM"

那么s1和s2将具有类似的格式,但InvariantCulture添加前导零,而“en-US”使用AM或PM。

因此,当你将日期保存到文本文件或解析数据时,InvariantCulture更适合内部使用。当您向最终用户显示数据(日期、货币……)时,指定的CultureInfo会更好。

JetBrains给出了一个合理的解释,

数据结构到文本的临时转换在很大程度上依赖于 当前的文化,并可能导致代码时意想不到的结果 的区域设置不同于 最初的开发人员。为了防止出现歧义,ReSharper会警告您 代码中可能发生此类问题的实例。”

但如果我在一个网站上工作,我知道将只有英文,我只是忽略了这个建议。

当将数字、日期和时间格式化为字符串或从字符串解析时,将使用区域性来确定如何执行。例如,在主要的en-US文化中,你有这些字符串表示:

1,000,000.00 - 100万加上一个两位数的分数 1/29/2013 -这篇文章发布的日期

在我的文化(da-DK)中,值有这样的字符串表示:

1.000.000,00 - 100万,两位数小数 2013年1月29日-本文发布日期

在Windows操作系统中,用户甚至可以自定义数字和日期/时间的格式,也可以选择其操作系统文化以外的其他文化。所使用的格式是用户的选择,这是它应该是怎样的。

因此,当你格式化一个要显示给用户的值时,例如使用ToString或String。使用DateTime从字符串格式化或解析。解析或十进制。解析默认是使用CultureInfo.CurrentCulture。这允许用户控制格式。

然而,很多字符串格式化和解析实际上不是应用程序和用户之间交换的字符串,而是应用程序和某些数据格式(例如XML或CSV文件)之间交换的字符串。在这种情况下,您不希望使用CultureInfo。CurrentCulture,因为如果格式化和解析是用不同的区域性完成的,它可能会中断。在这种情况下,您需要使用CultureInfo。InvariantCulture(基于en-US文化)。这确保值可以毫无问题地往返。

ReSharper给出警告的原因是,一些应用程序的作者没有意识到这种区别,这可能会导致意想不到的结果,但他们从未发现这一点,因为他们的CultureInfo。CurrentCulture是en-US,与CultureInfo.InvariantCulture具有相同的行为。但是,当应用程序在另一种区域性中使用时,可能会使用一种区域性进行格式化,而使用另一种区域性进行解析,应用程序可能会中断。

总结一下:

CultureInfo使用。如果您正在格式化或解析用户字符串,则CurrentCulture(默认值)。 CultureInfo使用。如果您正在格式化或解析一个应该由软件可解析的字符串,则使用InvariantCulture。 很少使用特定的国家文化,因为用户无法控制格式化和解析的方式。

并非所有区域性都使用相同的日期和十进制/货币值格式。

当您将存储为字符串的输入值(读取)转换为DateTime、浮点数、双精度或十进制时,这对您很重要。如果您试图将前面提到的数据类型格式化为字符串(写入)以供显示或存储,这也很重要。

如果您事先知道日期和十进制/货币值将处于哪种特定的文化中,则可以使用特定的CultureInfo属性(即CultureInfo("en-GB"))。例如,如果您希望用户输入。

CultureInfo。如果您正在格式化或解析一个字符串,该字符串应该由一个独立于用户本地设置的软件进行解析,则使用InvariantCulture属性。

默认值为CultureInfo。安装duiculture,因此默认的CultureInfo取决于正在执行的操作系统的设置。这就是为什么你应该始终确保文化信息符合你的意图(参见Martin的回答,这是一个很好的指导方针)。

CultureInfo。InvariantCulture例子 CultureInfo。StackOverflow上的InvariantCulture CultureInfo。InvariantCulture MSDN文章 预定义的CultureInfo名称

对于像数字(小数点,数字中的逗号)这样的东西,它们通常在特定的区域性中是首选的。

一个合适的方法是将其设置在文化层面(对于德语),就像这样:

Thread.CurrentThread.CurrentCulture.NumberFormat = new CultureInfo("de").NumberFormat;