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 を指定します