2010-03-11 72 views

回答

103

不變文化是一種特殊的文化,它是有用的,因爲它不會改變。當前的文化可以從一個用戶變爲另一個用戶,甚至從一個用戶變爲另一個用戶,所以你不能依靠它保持不變。

能夠每次使用相同的文化在幾個流程中是非常重要的,例如序列化:在一個文化中可以有1,1個值,在另一個文化中可以有1.1個。如果您嘗試在第二種文化中解析「1,1」值,則解析將失敗。但是,您可以使用不變文化將數字轉換爲字符串,然後使用任何區域性設置將其從任何計算機中解析出來。

// Use some non-invariant culture. 
CultureInfo nonInvariantCulture = new CultureInfo("en-US"); 
Thread.CurrentThread.CurrentCulture = nonInvariantCulture; 

decimal dec = 1.1m; 
string convertedToString = dec.ToString(); 

// Simulate another culture being used, 
// following code can run on another computer. 
nonInvariantCulture.NumberFormat.NumberDecimalSeparator = ","; 

decimal parsedDec; 

try 
{ 
    // This fails because value cannot be parsed. 
    parsedDec = decimal.Parse(convertedToString); 
} 
catch (FormatException) 
{ 
} 

// However you always can use Invariant culture: 
convertedToString = dec.ToString(CultureInfo.InvariantCulture); 

// This will always work because you serialized with the same culture. 
parsedDec = decimal.Parse(convertedToString, CultureInfo.InvariantCulture); 
+8

它的價值在於'System.Globalization'命名空間。 – 2013-07-23 01:25:25

+0

*這將永遠工作,因爲你用相同的文化序列化*「這對我沒有意義,我想我誤解了一些東西。如果使用'CultureInfo.InvariantCulture'工作是因爲您使用相同的文化序列化....那麼是不是使用'CultureInfo.CurrentCulture'? – Alisson 2017-02-25 05:25:51

+1

@Alisson如果你把Andrew的最後兩個代碼語句放回到原始流程中,我認爲它會更有意義。如果你總是使用'CultureInfo.InvariantCulture'序列化,那麼你就知道你總是可以使用'CultureInfo.InvariantCulture'解析回小數。如果您使用'CultureInfo.CurrentCulture'進行序列化,則您的用戶可能具有「en-US」作爲其當前文化。下一個將其解析爲小數的用戶可能會使用「,」作爲分隔符的當前文化。 – 2017-04-28 13:23:32

96

基於英語的虛假文化與定義的行爲。很好寫出,例如,東西到配置文件,所以它可以讀取和寫入,無論用戶定義的文化。

基本上它是一種特定的文化,是人造的,不會改變

+4

具體而言,您不會被字符串形式的數字中的逗號和點的不同用法或奇數情況下的轉換所捕捉。 – 2010-03-11 08:04:24

+6

Yesss ...典型問題: *認爲單詞是英語的美國程序員;)然後德國客戶爲1000寫入1.000,00;)Ouch。 *即使在相同的語言中,瑞士和德國也使用「。」。和「,」以不同的方式編號。 結果 - >配置文件是垃圾。 使用固定語言有;) – TomTom 2010-03-11 08:05:57

+16

爲了增加史蒂夫的評論:這就是我們的文化時要使用你實際上並沒有怎麼在意的事情*外觀*(你不在乎它是否使用逗號或點或什麼的,因爲用戶將永遠不會看到它),但你確實需要它永遠是相同的(例如,因爲你需要能夠閱讀你寫的內容)。 – itowlson 2010-03-11 08:38:03

6

它用於東西,是相同的,無論培養物(即不需要被轉換到一些培養X是適當的)

作爲一個例子 - https://msdn.microsoft.com/en-us/library/4c5zdc6a(v=vs.100).aspx。當你寫出一個用戶不應該搞亂的特定於應用程序的文件時,你應該對所有接受文化參數的方法使用InvariantCulture。

注意,按照上述鏈接的文檔:

但是,應用程序應該使用固定區域性僅用於需要非培養的結果被保存到文件過程,如格式化和解析數據。

+2

這就說明了不變文化只是一種中間格式,即如果你向用戶顯示的是不變文化輸出的東西(即'in'不變文化),你是做錯了事,不瞭解不變的文化。 – mlhDev 2015-12-18 03:14:53

2

不變的文化是文化不敏感的;它與英語相關,但不與任何國家/地區相關聯。您可以使用不變文化進行文化敏感的字符串操作,這些字符串操作不受當前線索文化約定的影響,且跨文化一致。

CultureInfo.InvariantCulture檢索 不變文化的實例。它可以用於幾乎任何需要文化的 System.Globalization命名空間中的任何方法。由諸如CompareInfo,DateTimeFormat和 NumberFormat等屬性返回的對象 也反映了不變文化的約定的字符串比較和格式設置 。

不同於培養敏感的數據,這是受由用戶 定製或更新到.NET框架或操作 系統改變,不變文化數據是隨着時間的推移穩定和跨 安裝培養物,並且不能由定製用戶。這使得不變文化特別適用於需要文化獨立結果的操作,例如持久化格式化數據的格式化和解析操作 ,或者需要按照固定順序顯示數據(而不管文化)的排序和排序操作。當你想顯示文化無關格式持久化數據

InvariantCulture屬性來得心應手。

舉例來說,如果你想顯示具體的獨立應用程序的當前區域性的格式的數字或日期時間,你可以使用CultureInfo.InvariantCulture

+0

-1,因爲如果沒有閱讀上面的內容,我絕對不會理解大部分解釋。在我看來,很不明確的是什麼*「不受當前線索文化慣例影響並且在不同文化間保持一致的文化敏感的字符串操作」*的意思是,而且我仍然不是100%肯定的你在報價後要寫在句子中的意思是什麼(*「顯示持久數據」*顯然是一個錯字,但我不知道是什麼)。 – 2017-05-05 10:36:46