我应该何时指定CurrentCulture或InvariantCulture以及何时应该将其指定为未指定?

时间:2010-07-12 19:03:57

标签: c# globalization culture cultureinfo currentculture

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

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

我发现它很长,很冗长,而且大部分时间都是丑陋的,每次都指定它,比如说:

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

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

一些好的阅读材料:

2 个答案:

答案 0 :(得分:18)

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

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

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

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

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

答案 1 :(得分:5)

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

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

相关问题