CultureInfo.InvariantCulture是什么意思?

我有这样一段文字:

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);

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


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

当您将以字符串形式存储的输入值(读取)转换为DateTimefloatdoubledecimal时,这对您来说很重要。 如果您尝试将上述数据类型格式化为字符串(写入)以进行显示或存储,这也会很重要。

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

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

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

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

  • 当数字,日期和时间被格式化为字符串或从字符串解析时,文化被用来确定如何完成。 例如,在主要en-US文化中,你有这些字符串表示:

  • 1,000,000.00 - 百万分之两位数
  • 2013年1月29日 - 此发布日期
  • 在我的文化中( da-DK ),这些值具有这种字符串表示形式:

  • 1,000,000,000 - 百万分之两位数
  • 29-01-2013 - 发布日期
  • 在Windows操作系统中,用户甚至可以自定义如何格式化数字和日期/时间,并且还可以选择不同于他操作系统文化的文化。 使用的格式是用户的选择,它应该如何。

    因此,当使用ToStringString.Format格式化要显示给用户的值时,或者使用DateTime.ParseDecimal.Parse从字符串解析时,默认情况下使用CultureInfo.CurrentCulture 。 这允许用户控制格式。

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

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

    所以总结一下:

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

  • 据微软称:

    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"
    

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

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

    链接地址: http://www.djcxy.com/p/75107.html

    上一篇: What does CultureInfo.InvariantCulture mean?

    下一篇: How does CultureInfo.InvariantCulture and DateTime to String works