我应该何时指定CurrentCulture或InvariantCulture以及何时不指定?

指定CurrentCulture或InvariantCulture而不指定文化的最佳做法是什么?

例如,根据我的阅读,如果您正在进行序列化,则需要使用InvariantCulture作为指定数据值的规范表示的方法。 这是基于文化的字符串操作的相对较小的百分比。

我发现它很长,很冗长,而且大多数时候都是丑陋的,每次我都说出来,比如说:

var greeting = string.Format(CultureInfo.CurrentCulture, "Hello ", userName); 

然而,我的团队最近开启了FxCop,现在总是在每个地方都使用CultureInfo。 结合简洁性,可读性和function性的最佳技术是什么?

一些好的阅读材料:

  • 使用InvariantCulture属性
  • CultureInfo类

这里有一个固有的权衡取舍。

至少,只要您在程序内部执行任何操作,就需要指定CultureInfo以使用InvariantCulture。 例如,将其与序列化一起使用会强制数据表示始终相同,因此您不必担心内部数据格式的国际化问题。

话虽如此,在任何地方指定这一点都有一些优点 – 主要是强迫你确保你正确处理这个。 内部程序工作与UI工作需要指定不同的文化(假设您要正确本地化您的应用程序)。 因此,复杂的程序往往要求在任何地方指定它,因为留下“默认”充其量是危险的,并且随着时间的推移往往会引入错误。

但是,正如您所注意到的那样,指定此方法往往会增加代码的大小,并可能降低可读性。 这通过更短的代码与适当的国际化以及本地化和可维护性之间的权衡 – 可读性和可维护性,通过在任何地方更加明确。

在我看来,这里没有“正确”的答案 – 这实际上取决于你的申请。 如果您的应用程序完全是关于演示文稿,而不是进行大量数据操作,尤其是不使用任何类型的自我管理文件存储,那么设置当前文化(和ui文化)一次可能没问题。 我发现更复杂的应用程序往往不能以这种方式工作,但是,在这种情况下,FxCop在任何地方指定这一点的建议似乎更具吸引力。

默认值已经是Windows初始化的当前文化。 因此明确使用CultureInfo.CurrentCulture只是浪费时间。 任何体面的序列化格式(包括二进制序列化和XML序列化)都将以文化不变的方式序列化DateTime。

使用非默认的文化是非常危险的。 始终使用Windows指定的默认区域性启动线程,并在用户安装Windows时进行配置。 .NET一直在启动线程池线程,你可能会冒险在该线程中获得与主线程不同的文化。 这可能会导致各种微妙的问题。 就像拥有一个突然不再排序的SortedList一样。