CultureInfo.InvariantCulture是什么意思?

我有一个像这样的文本string:

var foo = "FooBar"; 

我想声明第二个string叫做bar并且使它等于我的第一个foo第一个和第四个字符,所以我这样做是这样的:

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

这个按预期工作,但ReSharperbuild议我把Culture.InvariantCulture放在我的括号内,所以这行代码如下所示:

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

这是什么意思,它会影响我的程序如何运行?

不是所有的文化都使用相同的date和十进制/货币值的格式。

当您将以stringforms存储的input值(读取)转换为DateTimefloatdoubledecimal时,这将对您有所帮助。 如果您尝试将上述数据types格式化为string(写入)以供显示或存储,那么这也同样重要。

如果你知道你的date和十进制/货币值将提前在什么特定的文化,你可以使用特定的CultureInfo属性(即CultureInfo("en-GB") )。 例如,如果你期望用户input。

如果您正在格式化或parsing应由一个独立于用户本地设置的软件parsing的string,则使用CultureInfo.InvariantCulture属性。

默认值是CultureInfo.InstalledUICulture所以默认的CultureInfo取决于正在执行的操作系统的设置。 这就是为什么你应该始终确保文化信息符合你的意图(见马丁的答案是一个很好的指导方针)。

  • CultureInfo.InvariantCulture示例
  • CultureInfo.InvariantCulture在StackOverflow
  • CultureInfo.Invariant文化MSDN文章
  • 预定义的CultureInfo名称

当数字,date和时间被格式化为string或从stringparsing时,文化被用来确定如何完成。 例如在主要en-US文化中,你有这些string表示:

  • 1,000,000.00 – 百万分之两位数
  • 2013年1月29日 – 发布date

在我的文化( da-DK )中,这些值具有这种string表示forms:

  • 1000万-100万,有两位数的分数
  • 29-01-2013 – 发布date

在Windows操作系统中,用户甚至可以自定义如何格式化数字和date/时间,也可以select不同于他的操作系统的文化。 使用的格式是用户的select,它应该是怎样的。

所以当你使用ToString或者String.Format格式化一个要显示给用户的值时,或者使用DateTime.Parse或者Decimal.Parse从一个string中parsing时,默认是使用CultureInfo.CurrentCulture 。 这允许用户控制格式。

然而,很多string格式化和parsing实际上并不是在应用程序和用户之间,而是在应用程序和一些数据格式(例如XML或CSV文件)之间进行的。 在这种情况下,您不想使用CultureInfo.CurrentCulture因为如果使用不同的文化进行格式化和parsing,则可能会中断。 在这种情况下,您想使用CultureInfo.InvariantCulture (基于en-US文化)。 这确保了这些值可以无障碍地往返。

ReSharper给你的警告的原因是,一些应用程序的作者不知道这种区别,可能会导致意想不到的结果,但他们从来没有发现这一点,因为他们的CultureInfo.CurrentCultureen-US ,具有与CultureInfo.InvariantCulture相同的行为。 但是,只要应用程序在另一种文化中使用,即有可能使用一种文化进行格式化,而另一种文化则可能会破坏应用程序。

所以总结一下:

  • 如果格式化或parsing用户string,请使用CultureInfo.CurrentCulture (默认值)。
  • 使用CultureInfo.InvariantCulture如果您正在格式化或parsing应由一个软件可parsing的string。
  • 很less使用特定的民族文化,因为用户无法控制如何完成格式化和分析。

据微软称:

CultureInfo.InvariantCulture属性既不是中性也不是特定的文化。 这是文化不敏感的第三种文化types。 它与英语有关,但与一个国家或地区不相关。

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

所以InvariantCulture是相似的文化“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。

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

对于数字(小数点,逗号等),它们通常在特定文化中是首选。

一个适当的方法来做到这一点将在文化层面(德国)这样的:

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

JetBrains提供了一个合理的解释 ,但如果我在一个网站上工作,我知道只会用英文,我只是忽略了这个build议。