CA1304:指定 CultureInfo
型別名稱 |
SpecifyCultureInfo |
CheckId |
CA1304 |
分類 |
Microsoft.Globalization |
中斷變更 |
中斷 |
方法或建構函式會呼叫具有接受 CultureInfo 參數之多載的成員,且方法或建構函式未呼叫採用 CultureInfo 參數的多載。此規則會忽略對下列方法的呼叫:
如果未提供 CultureInfo 或 IFormatProvider 物件,則多載成員所提供的預設值並非在所有地區設定中都會產生您想要的作用。此外,.NET Framework 成員可能會選擇預設的文化特性 (Culture) 和格式,但是它所根據的假設對您的程式碼而言可能是錯誤的。若要確保程式碼能如預期般在案例中運作,您必須根據下列方針提供文化特性資訊:
如果要對使用者顯示值,請使用目前的文化特性。請參閱 CultureInfo.CurrentCulture。
如果軟體會儲存和存取值,也就是保存到檔案或資料庫,請使用不因文化特性而異 (Invariant Culture)。請參閱 CultureInfo.InvariantCulture。
如果您不知道值的目的端,請讓資料消費者 (Data Consumer) 或提供者指定文化特性。
請注意,CultureInfo.CurrentUICulture 只用於使用 ResourceManager 類別 (Class) 的執行個體擷取當地語系化資源。
即使多載成員的預設行為不符合需要,您最好能明確呼叫文化特性的多載,讓程式碼可以自我記錄,也會更容易維護。
若要修正此規則的違規情形,請使用接受 CultureInfo 或 IFormatProvider 的多載,並根據先前列出的方針指定引數。
當您確定預設的文化特性/格式提供者是正確的選擇,而且程式碼維護性不是重要的優先開發考量,則您可以放心地隱藏這項規則的警告。
在下列範例中,BadMethod 會造成這條規則的兩個違規。GoodMethod 藉由將不因國別而異的文化特性傳遞至 System.String.Compare,修正第一個違規,並藉由將目前的文化特性傳遞至 ToLower,修正第二個違規,這是因為已經向使用者顯示 string3。
using System;
using System.Globalization;
namespace GlobalizationLibrary
{
public class CultureInfoTest
{
public void BadMethod(String string1, String string2, String string3)
{
if(string.Compare(string1, string2, false) == 0)
{
Console.WriteLine(string3.ToLower());
}
}
public void GoodMethod(String string1, String string2, String string3)
{
if(string.Compare(string1, string2, false,
CultureInfo.InvariantCulture) == 0)
{
Console.WriteLine(string3.ToLower(CultureInfo.CurrentCulture));
}
}
}
}
在下列範例中,程式碼會顯示目前的文化特性對 DateTime 型別選取之預設 IFormatProvider 的效果。
using System;
using System.Globalization;
using System.Threading;
namespace GlobalLibGlobalLibrary
{
public class IFormatProviderTest
{
public static void Main()
{
string dt = "6/4/1900 12:15:12";
// The default behavior of DateTime.Parse is to use
// the current culture.
// Violates rule: SpecifyIFormatProvider.
DateTime myDateTime = DateTime.Parse(dt);
Console.WriteLine(myDateTime);
// Change the current culture to the French culture,
// and parsing the same string yields a different value.
Thread.CurrentThread.CurrentCulture = new CultureInfo("Fr-fr", true);
myDateTime = DateTime.Parse(dt);
Console.WriteLine(myDateTime);
}
}
}
這個範例產生下列輸出。