共用方式為


CA1305:指定 IFormatProvider

型別名稱

SpecifyIFormatProvider

CheckId

CA1305

分類

Microsoft.Globalization

中斷變更

中斷

原因

方法或建構函式 (Constructor) 所呼叫的一或多個成員具有可接受 System.IFormatProvider 參數的多載,但該方法或建構函式並未呼叫可接受 IFormatProvider 參數的多載。 此規則會忽略對 .NET Framework 方法的呼叫,這些方法已記錄為忽略 IFormatProvider 參數,以及下列方法:

規則描述

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

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

  • 如果要讓軟體儲存或存取值 (在檔案或資料庫內保存),請使用不因文化特性而異的值。 請參閱CultureInfo.InvariantCulture

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

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

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

如何修正違規

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

隱藏警告的時機

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

範例

在下列範例中,BadMethod 會造成這條規則的兩個違規。 GoodMethod 藉由將不因國別而異的文化特性傳遞至 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);
        }
    }
}

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

  

相關規則

CA1304:指定 CultureInfo

請參閱

概念

使用 CultureInfo 類別