本文參考自CultureInfo中重要的InvariantCulture,純屬讀書筆記,加深記憶
1、CultureInfo的InvariantCulture的作用
(1)、CultureInfo使整個.NET Framework更加人性化,因為這可以使同一個資料適應不同地區和文化,這樣當然滿足處於不同地區和文化的使用者。但前提是資料給“人”看,如果這些資料用於計算機之間的傳輸,即給“機器”看,這樣的多文化處理反而不妥,造成同一個資料的不同展現形式,尤其是讀寫兩方的文化地區不同時,資料可能根本無法被正常讀取或者產生潛在bug,因此這裡,正是InvariantCulture的用武之地。
(2)、當進行數字,日期時間,字串匹配時,都會進行CultureInfo的操作,也就是不同的CultureInfo下,這些操作的結果可能會不一樣。這裡要介紹一下非常容易被忽視InvariantCulture。
2、使用場景
你編寫一個程式,要向資料中心伺服器傳遞一些時間資料,你會怎麼寫?直接DateTime.ToString()?那你就大錯特錯了,下面用程式碼,舉個非常形象的例子。在一個控制檯裡,模擬資料中心,然後放出多個執行緒,模擬客戶端程式傳遞資料。
static readonly string[] CultureSources = { "en-us", "zh-cn", "ar-iq", "de-de" }; static readonly Random Ran = new Random(Environment.TickCount); static void Main() { Console.WriteLine("資料中心開始接受客戶端資料:"); for (int i = 0; i < CultureSources.Length; i++) ThreadPool.QueueUserWorkItem(Client, i); Console.ReadKey(true); Console.WriteLine(""); Console.WriteLine("資料中心:…………"); } static void Client(object obj) { int id = (int)obj; Thread.Sleep(Ran.Next(1000)); CultureInfo cul = CultureInfo.GetCultureInfo(CultureSources[id]); Thread.CurrentThread.CurrentCulture = cul; Console.WriteLine("某客戶端作業系統語言設定{0}\n傳送資料:{1}\n", cul.DisplayName, new DateTime(1990, 10, 27).ToShortDateString()); }
同樣的DateTime.ToShortDateString(),在英語-美國,中文-中國,阿拉伯語-伊拉克和德語-德國的不同環境下,1990年10月27日竟然有如此不同的輸出結果,這些資料讓資料中心伺服器情何以堪啊!!!
造成這個情況的原因是:在進行日期時間輸出時,.NET會考慮當前執行緒的CultureInfo,即Thread.CurrentThread.CurrentCulture(或者CultureInfo.CurrentCulture),並根據CultureInfo,進行相應地區文化的資料處理。注意不要和UICulture混淆。
解決方案就是使用這個特殊的InvariantCulture.解決程式碼如下:
Console.WriteLine("某客戶端作業系統語言設定{0}\n傳送資料:{1}\n", cul.DisplayName, new DateTime(1990, 10, 27).ToString(CultureInfo.InvariantCulture.DateTimeFormat.ShortDatePattern, CultureInfo.InvariantCulture));
ok,這樣不管客戶端執行在什麼語言環境下,輸出的時間格式都是統一的,方面資料中心伺服器對資料做後續處理。這樣所有的輸出結果都保持一致了。