共用方式為


指定 CultureInfo

更新:2007 年 11 月

型別名稱

SpecifyCultureInfo

CheckId

CA1304

分類

Microsoft.Globalization

中斷變更

非中斷

原因

方法或建構函式會呼叫具有接受 System.Globalization.CultureInfo 參數之多載的成員,且方法或建構函式未呼叫採用 CultureInfo 參數的多載。此規則會忽略對下列方法的呼叫:

規則描述

如果未提供 CultureInfoSystem.IFormatProvider 物件,則多載成員所提供的預設值在所有地區設定中不會有您想要的作用。此外,.NET Framework 成員可能會選擇預設的文化特性 (Culture) 和格式,但是它所根據的假設對您的程式碼而言可能是錯誤的。若要確保程式碼能如預期般在案例中運作,您必須根據下列方針提供文化特性資訊:

  • 如果會對使用者顯示值,請使用目前的文化特性。請參閱 CultureInfo.CurrentCulture

  • 如果軟體會儲存和存取值,也就是保存到檔案或資料庫,請使用不因文化特性而異 (Invariant Culture)。請參閱 CultureInfo.InvariantCulture

  • 如果您不知道值的目的端,請讓資料消費者或提供者指定文化特性。

請注意,CultureInfo.CurrentUICulture 只用於擷取使用 System.Resources.ResourceManager 類別 (Class) 之執行個體的當地語系化資源。

即使多載成員的預設行為不符合需要,您最好能明確呼叫文化特性的多載,讓程式碼可以自我記錄,也會更容易維護。

如何修正違規

若要修正此規則的違規情形,請使用接受 CultureInfoIFormatProvider 的多載,並根據先前列出的方針指定引數。

隱藏警告的時機

當您確定預設的文化特性/格式提供者是正確的選擇,而且程式碼維護性不是重要的優先開發考量,則您可以放心地隱藏這項規則的警告。

範例

在下列範例中,BadMethod 會造成此規則的兩種違規情形。因為會對使用者顯示 string3,所以 GoodMethod 會將不因文化特性而異傳遞到 System.String.Compare 以更正第一個違規情形,並將目前的文化特性傳遞到 ToLower 以更正第二個違規情形。

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);
        }
    }
}

這個範例會產生下列輸出:

6/4/1900 12:15:12 PM
06/04/1900 12:15:12

相關規則

指定 IFormatProvider

請參閱

概念

使用 CultureInfo 類別