2010-07-12 63 views
19

指定CurrentCulture或InvariantCulture並且根本不指定文化的最佳做法是什麼?什麼時候應該指定CurrentCulture或InvariantCulture,什麼時候應該讓它不指定?

從我讀過的內容來看,例如,如果要進行序列化,則需要InvariantCulture作爲指定數據值標準表示的手段。這是基於文化的字符串操作的相對較小比例。

我覺得很長,冗長和醜陋的大部分時間,我每次做的時候指定它,說:

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

然而,我的團隊最近打開的FxCop上,現在有一個推總是使用CultureInfo無處不在。結合簡潔性,可讀性和功能性的最佳技術是什麼?

一些很好的閱讀材料:

回答

16

有一個固有的權衡在這裏打球。

至少,您需要指定CultureInfo在您的程序中執行任何內部操作時使用InvariantCulture。例如,在序列化中使用它會強制數據表示始終保持一致,因此您不必擔心內部數據格式的國際化問題。這就是說,無處不在有一些優點 - 主要是強迫你確保你正確地處理這個問題。內部程序工作與UI工作需要指定不同的文化(只要您想正確定位應用程序)。因此,一個複雜的程序往往要求在任何地方都指定它,因爲離開「默認」最好是危險的,而且往往會隨着時間的推移而引入錯誤。

但是,正如您注意到的那樣,指定此代碼會增加代碼的大小,並可能降低可讀性。這導致了權衡 - 可讀性和可維護性通過更短的代碼與適當的國際化和本地化和可維護性相關,因爲它們在任何地方都更加明確。

在我看來,這裏沒有「正確的」答案 - 這取決於你的應用程序。如果您的應用程序完全是關於演示文稿,而不是進行大量的數據操作,特別是沒有任何類型的自管理文件存儲,那麼將當前的文化(和ui文化)設置一次可能沒問題。我發現,更復雜的應用程序往往不適用於這種方式,但是,在這種情況下,FxCop提出的在任何地方指定它的建議似乎更具吸引力。

+1

@Reed Copsey:我還發現,將它作爲FxCop反射文件添加到其他地方會產生錯誤 - 我曾多次看到錯誤的文化選項被指定的情況。這顯然只是一個教育問題,但當FxCop這樣的事情告訴你要做的事情時卻經常發生,但你不一定明白爲什麼。 – 2010-07-12 19:19:55

+2

@ Scott:真的。但編程中的一切都是這種情況 - 如果你要使用它,你需要了解它,否則它會咬你。進行本地化的唯一理想方式是在您第一次編寫代碼時考慮它 - 對完成的產品進行本地化是最糟糕的工作之一,從一開始就比從頭開始考慮要昂貴一個數量級。 – 2010-07-12 19:35:54

+0

我不同意。我會把文化放在我班的所有ToString()中嗎?我認爲邏輯和對象應該不瞭解文化。 – onof 2010-07-12 19:40:48

5

默認值已經是Windows初始化的當前文化。因此明確使用CultureInfo.CurrentCulture只是浪費時間。任何體面的序列化格式(包括二進制序列化和XML序列化)都會以文化不變的方式序列化DateTime。

使用非默認文化是非常危險的。一個線程將始終以Windows指定的默認文化啓動,並且在安裝Windows時由用戶配置。 .NET始終啓動線程池線程,您將冒險在該線程中獲得與主線程不同的文化。這可能會導致各種微妙的問題。就像有一個突然沒有排序的SortedList一樣。

相關問題