我应该什么时候指定CurrentCulture或InvariantCulture,什么时候应该不指定?

22
什么是指定CurrentCulture或InvariantCulture以及不指定文化的最佳实践?
根据我所了解的,如果您正在进行序列化等操作,则需要使用InvariantCulture来指定数据值的规范表示形式。这只占基于文化的字符串处理的相对较小部分。
大多数时间我觉得在每次执行以下操作时都要指定它很冗长、啰嗦且难看:
var greeting = string.Format(CultureInfo.CurrentCulture, "Hello ", userName); 

然而,我的团队最近开启了 FxCop,现在有一种推动力量要求所有地方都使用 CultureInfo。那么,在简洁性、可读性和功能性方面,最佳的技术组合是什么?

一些好的阅读材料:

2个回答

19

这里存在一种固有的权衡。至少,在程序内部进行任何操作时,您都应该指定CultureInfo为InvariantCulture。例如,使用Serialization时强制数据表示始终相同,因此您不必担心内部数据格式的国际化问题。

话虽如此,到处指定这个选项也有一些优点——主要是在于它可以确保正确处理。内部程序工作与UI工作需要指定不同的Culture(假设您想正确本地化您的应用程序)。因此,复杂的程序往往需要在每个地方都指定此选项,因为留下“默认”选项最多是危险的,并且随着时间的推移,容易引入错误。

然而,正如您所注意到的,指定这个选项往往会增加代码的大小,可能会降低可读性。这导致了权衡——通过更短的代码提高可读性和可维护性,还是通过在每个地方更明确地指定来实现适当的国际化和本地化以及可维护性。

在我看来,这里没有“正确”的答案——这真的取决于您的应用程序。如果您的应用程序完全关注展示,而不进行大量数据操作,尤其不涉及任何类型的自管理文件存储,则可以一次设置当前Culture(和UI Culture)即可。然而,我发现更复杂的应用程序往往不能以这种方式正常工作,在这种情况下,指定此选项的建议似乎更具吸引力。


1
@Reed Copsey:我也发现在每个地方都像FxCop一样添加它会创建错误--有几次我看到指定了错误的文化选项。这显然只是一个教育问题,但当像FxCop这样的工具告诉你要做什么,而你并不一定理解为什么时,这是一个常见的情况。 - Scott Stafford
2
@Scott:没错。但这在编程中是普遍存在的 - 如果你要使用它,就必须理解它,否则它会反噬你。唯一明智的本地化方法是在编写代码时首先考虑它 - 本地化已完成的产品是最糟糕的工作之一,比从一开始就考虑它要昂贵一个数量级。 - Jason Williams
1
顺便说一句,解决FXCop警告并保持代码可读的一种方法是编写自己的包装器方法来隐藏CultureInfo。例如编写一个FormatStringForUI()方法,它将始终使用UI文化。这样可以清理您的代码,并为程序员提供更简单、更清晰的选择范围:(例如UI或序列化?)(@onof:确切地说:-) - Jason Williams
1
@onof:通常我会有一个服务来提供文化,并在那里指定。然而,这真的是一个规模的问题 - 面向国际市场的大型项目需要非常小心地处理文化,将其放置在各处有助于确保正确性。 - Reed Copsey
明白了。事实上,我没有考虑在业务逻辑中注入本地化服务。谢谢。 - onof
显示剩余3条评论

5
默认情况下,当前文化已由Windows初始化。因此,显式地使用CultureInfo.CurrentCulture只是浪费时间。任何良好的序列化格式(包括二进制序列化和XML序列化)都将以文化不变的方式序列化DateTime。
使用非默认文化非常危险。线程始终会以Windows指定的默认文化和用户在安装Windows时配置的文化开始。.NET经常启动线程池线程,您可能会冒着在该线程中得到与主线程不同的文化的风险。这可能会导致各种微妙的问题,例如突然不再排序的SortedList。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接