我有一串这样的文字:
var foo = "FooBar";
Run Code Online (Sandbox Code Playgroud)
我想声明第二个字符串,bar
并使其等于我的第一个和第四个字符foo
,所以我这样做:
var bar = foo[0].ToString() + foo[3].ToString();
Run Code Online (Sandbox Code Playgroud)
这可以按预期工作,但ReSharper建议我把它Culture.InvariantCulture
放在我的括号内,所以这一行最终如下:
var bar = foo[0].ToString(CultureInfo.InvariantCulture)
+ foo[3].ToString(CultureInfo.InvariantCulture);
Run Code Online (Sandbox Code Playgroud)
这是什么意思,它会影响我的程序运行方式吗?
Joh*_*hnB 139
并非所有文化都使用相同的日期和小数/货币值格式.
当你转换输入值这个问题将你(读)存储为字符串 DateTime
,float
,double
或decimal
.如果您尝试将上述数据类型格式化为字符串(写入)以进行显示或存储,则也很重要.
如果您知道您的日期和小数/货币值将提前具体的特定文化,您可以使用该特定CultureInfo
属性(即CultureInfo("en-GB")
).例如,如果您希望用户输入.
CultureInfo.InvariantCulture
如果要格式化或解析一个应该由独立于用户本地设置的软件解析的字符串,则使用该属性.
默认值为CultureInfo.InstalledUICulture
默认CultureInfo取决于正在执行的操作系统设置.这就是为什么你应该总是确保文化信息符合你的意图(参见马丁的答案以获得一个好的指导方针).
Mar*_*age 133
当数字,日期和时间被格式化为字符串或从字符串解析时,文化将用于确定它是如何完成的.例如,在主流en-US
文化中,您有以下字符串表示:
在我的culture(da-DK
)中,值具有此字符串表示形式:
在Windows操作系统中,用户甚至可以自定义数字和日期/时间的格式,也可以选择另一种文化而不是其操作系统的文化.使用的格式是用户的选择,它应该如何.
所以,当你格式化使用例如被显示给用户的值ToString
或者String.Format
或者使用从字符串解析DateTime.Parse
或Decimal.Parse
默认是使用CultureInfo.CurrentCulture
.这允许用户控制格式.
但是,许多字符串格式化和解析实际上不是在应用程序和用户之间交换的字符串,而是在应用程序和某些数据格式(例如XML或CSV文件)之间交换的字符串.在这种情况下,你不想使用,CultureInfo.CurrentCulture
因为如果使用不同的文化进行格式化和解析,它可能会破坏.在这种情况下,你想使用CultureInfo.InvariantCulture
(这是基于en-US
文化).这确保了值可以没有问题地往返.
该ReSharper的给你警告的原因是,一些应用程序编写者不知道这种区别可能导致意想不到的结果,但他们从来没有发现这一点,因为他们CultureInfo.CurrentCulture
是en-US
具有相同行为CultureInfo.InvariantCulture
.但是,只要应用程序在另一种文化中使用,其中有可能使用一种文化进行格式化,另一种用于解析应用程序可能会中断.
总结一下:
CultureInfo.CurrentCulture
如果要格式化或解析用户字符串,请使用(默认值).CultureInfo.InvariantCulture
如果格式化或解析应该由一个软件是解析的字符串.hap*_*its 24
根据微软的说法:
CultureInfo.InvariantCulture属性既不是中立文化也不是特定文化.这是第三种对文化不敏感的文化.它与英语有关,但与国家或地区无关.
(来自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"
Run Code Online (Sandbox Code Playgroud)
然后s1和s2将具有similair格式,但InvariantCulture添加前导零,"en-US"使用AM或PM.
因此,当您例如将日期保存到文本文件或解析数据时,InvariantCulture更适合内部使用.当您向最终用户提供数据(日期,货币......)时,指定的CultureInfo会更好.