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值(读取)转换为DateTime
, float
, double
或decimal
时,这将对您有所帮助。 如果您尝试将上述数据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.CurrentCulture
是en-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议。