<p>当数字、日期和时间格式化为字符串或从字符串中解析时,使用区域性来确定如何执行。E、 g.在主要的<code>en-US</code>区域性中,有以下字符串表示:</p>
<ul>
<li>1000000.00-一百万,带两位小数</li>
<li>2013年1月29日-发布日期</li>
</ul>
<p>在我的区域性(<code>da-DK</code>)中,值具有以下字符串表示:</p>
<ul>
<li>1000.000,00-一百万,带两位小数</li>
<li>2013年1月29日-发布日期</li>
</ul>
<p>在Windows操作系统中,用户甚至可以自定义数字和日期/时间的格式,还可以选择其他区域性,而不是操作系统的区域性。所使用的格式是用户的选择,这是它应该如何使用的。</p>
<p>因此,当您使用例如<code>ToString</code>或<code>String.Format</code>对要显示给用户的值进行格式化,或者使用<code>DateTime.Parse</code>或<code>Decimal.Parse</code>对字符串进行解析时,默认值是使用<code>CultureInfo.CurrentCulture</code>。这允许用户控制格式。</p>
<p>然而,许多字符串格式化和解析实际上并不是应用程序和用户之间的字符串交换,而是应用程序和某些数据格式(例如XML或CSV文件)之间的字符串交换。在这种情况下,您不想使用<code>CultureInfo.CurrentCulture</code>,因为如果使用不同的区域性进行格式化和解析,它可能会中断。在这种情况下,您需要使用<code>CultureInfo.InvariantCulture</code>(它基于<code>en-US</code>区域性)。这确保了值可以无问题地往返。</p>
<p>ReSharper给您发出警告的原因是,一些应用程序编写器不知道这一区别,这可能会导致意外的结果,但他们永远不会发现这一点,因为他们的<code>CultureInfo.CurrentCulture</code>是<code>en-US</code>,其行为与<code>CultureInfo.InvariantCulture</code>相同。但是,一旦应用程序在另一个区域性中使用,其中有可能使用一个区域性进行格式化,而使用另一个区域性进行解析,则应用程序可能会中断。</p>
<p>所以总结一下:</p>
<ul>
<li>如果要格式化或分析用户字符串,请使用<code>CultureInfo.CurrentCulture</code>(默认值)。</li>
<li>如果您正在格式化或解析一个应该由软件解析的字符串,请使用<code>CultureInfo.InvariantCulture</code>。</li>
<li>很少使用特定的民族文化,因为用户无法控制格式化和解析的方式。</li>
</ul>