我有一串这样的文字:
var foo = "FooBar";
我想声明第二个名为bar
的字符串,并使其等于第一个foo
的第一个和第四个字符,所以我这样做:
var bar = foo[0].ToString() + foo[3].ToString();
这是按预期工作的,但是ReSharper建议我将Culture.InvariantCulture
放在括号内,这样这一行就这样结束了:
var bar = foo[0].ToString(CultureInfo.InvariantCulture)
+ foo[3].ToString(CultureInfo.InvariantCulture);
这意味着什么,它会影响我的程序运行吗?
当数字、日期和时间格式化为字符串或从字符串中解析时,使用区域性来确定如何执行。E、 g.在主要的
en-US
区域性中,有以下字符串表示:在我的区域性(
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
。并非所有区域性对日期和十进制/货币值使用相同的格式。
当您将存储为字符串的输入值转换为
DateTime
、float
、double
或decimal
时,这对您很重要。如果您试图将上述数据类型格式化为字符串(write)以供显示或存储,这也很重要。如果您提前知道日期和十进制/货币值将在哪个特定区域性中,则可以使用该特定的
CultureInfo
属性(即CultureInfo("en-GB")
)。例如,如果您希望用户输入。如果正在格式化或解析一个字符串,则使用
CultureInfo.InvariantCulture
属性,该字符串应由一个独立于用户本地设置的软件解析。默认值是
CultureInfo.InstalledUICulture
,因此默认的CultureInfo取决于执行操作系统的设置。这就是为什么您应该始终确保区域性信息符合您的意图(请参见Martin's answer以获得良好的指导原则)。据微软称:
(来自http://msdn.microsoft.com/en-us/library/4c5zdc6a(vs.71).aspx)
因此,不变性文化与文化“我们”相似,但并不完全相同。如果你写:
然后s1和s2将具有相似的格式,但是不变量区域性添加前导零,“en-US”使用AM或PM。
因此,当您将日期保存到文本文件或分析数据时,不变量区域性更适合内部使用。当您向最终用户显示数据(日期、货币…)时,指定的CultureInfo更好。
相关问题 更多 >
编程相关推荐