20

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

从我读过的内容来看,例如,如果您正在进行序列化,则需要 InvariantCulture 作为指定数据值的规范表示的一种方式。这是基于文化的字符串操作的相对较小百分比。

我发现它很长,很冗长,而且很丑,每次我都指定它,比如:

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

然而,我的团队最近打开了 FxCop,现在有一种推动力,即始终在任何地方使用 CultureInfo。结合简洁性、可读性和功能性的最佳技术是什么?

一些不错的阅读材料:

4

2 回答 2

19

这里有一个内在的权衡。

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

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

但是,正如您所注意到的,指定这一点往往会增加代码的大小,并可能降低可读性。这导致了权衡——通过更短的代码实现的可读性和可维护性与通过在任何地方都更加明确的适当的国际化、本地化和可维护性。

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

于 2010-07-12T19:16:18.997 回答
5

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

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

于 2010-07-12T19:16:20.143 回答