CA1304: CultureInfo を指定します

TypeName

SpecifyCultureInfo

CheckId

CA1304

分類

Microsoft.Globalization

互換性に影響する変更点

なし

原因

メソッドまたはコンストラクターが、CultureInfo パラメーターを受け入れるオーバーロードを持つメンバーを呼び出し、そのメソッドまたはコンストラクターは、CultureInfo パラメーターを使用するオーバーロードを呼び出していません。この規則では、次のメソッドの呼び出しは無視されます。

規則の説明

CultureInfo オブジェクトまたは IFormatProvider オブジェクトが指定されない場合、オーバーロードされたメンバーから提示された既定値は、すべてのロケールに効果が及ばない可能性があります。また、.NET Framework のメンバーは、コードに適していない可能性を考慮して、既定のカルチャと書式指定を選択します。状況に合わせてコードが適切に機能するように、次のガイドラインに従ってカルチャ固有の情報を指定します。

  • 値がユーザーに表示される場合、現在のカルチャを使用します。「CultureInfo.CurrentCulture」を参照してください。

  • 値が格納され、ソフトウェアからアクセスされる場合、つまりファイルまたはデータベースに保持される場合、インバリアント カルチャを使用します。「CultureInfo.InvariantCulture」を参照してください。

  • 値の出力先がわからない場合、データの使用者または提供者がカルチャを指定するようにします。

CultureInfo.CurrentUICulture が使用されるのは、ResourceManager クラスのインスタンスを使用して、ローカライズされたリソースを取得する場合のみであることに注意してください。

オーバーロードされたメンバーの既定の動作がコードの要件に適している場合でも、カルチャ固有のオーバーロードを明示的に呼び出すことをお勧めします。これは、コードが自己文書化され、保守が容易になるためです。

違反の修正方法

この規則違反を修正するには、CultureInfo または IFormatProvider を受け入れるオーバーロードを使用し、上記のガイドラインに従って引数を指定します。

警告を抑制する状況

既定のカルチャ/書式プロバイダーが正しく選択されていて、開発上、コードの保守性が重要ではない場合は、この規則による警告を抑制しても安全です。

使用例

BadMethod がこの規則の 2 つの違反を引き起こす例を次に示します。GoodMethod は、インバリアント カルチャを System.String.Compare に渡すことで 1 つ目の違反を修正し、現在のカルチャを ToLower に渡すことで 2 つ目の違反を修正します。これは、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);
        }
    }
}

この例を実行すると、次の出力が生成されます。

  

関連規則

CA1305: IFormatProvider を指定します

参照

その他の技術情報

CultureInfo クラスの使用