CA1305:IFormatProvider を指定します
プロパティ | 値 |
---|---|
ルール ID | CA1305 |
Title | IFormatProvider を指定します |
[カテゴリ] | グローバリゼーション |
修正が中断ありか中断なしか | なし |
.NET 9 では既定で有効 | いいえ |
原因
System.IFormatProvider パラメーターを受け取るオーバーロードがあるメソッドを呼び出し、そのオーバーロードが呼び出されていません。
この規則は、IFormatProvider パラメーターを無視するように記述されている .NET メソッドの呼び出しを無視します。 この規則では、次のメソッドも無視されます。
- Activator.CreateInstance
- ResourceManager.GetObject
- ResourceManager.GetString
- Boolean.ToString
- Char.ToString
- Guid.ToString
規則の説明
System.Globalization.CultureInfo オブジェクトまたは IFormatProvider オブジェクトが指定されない場合、オーバーロードされたメンバーから提示された既定値は、すべてのロケールに効果が及ばない可能性があります。 また、.NET メンバーは、コードに対して正しくない可能性がある仮定に基づいて、デフォルトのカルチャと書式設定を選択します。 シナリオに合わせてコードが期待どおりに動作するようにするには、次のガイドラインに従って、カルチャ固有の情報を指定する必要があります。
値がユーザーに表示される場合は、現在のカルチャを使用します。 以下を参照してください。CultureInfo.CurrentCulture
値がソフトウェアによって保存およびアクセスされる場合 (ファイルまたはデータベースに保存される場合) は、インバリアント カルチャを使用します。 以下を参照してください。CultureInfo.InvariantCulture
値の送信先がわからない場合は、データ コンシューマーまたはプロバイダーによってカルチャが指定されるようにしてください。
オーバーロードされたメンバーのデフォルトの動作がニーズに適している場合でも、コードが自己文書化され、より簡単に管理できるように、カルチャ固有のオーバーロードを明示的に呼び出すことをお勧めします。
違反の修正方法
この規則違反を修正するには、IFormatProvider の引数を受け取るオーバーロードを使用します。 または、インバリアント カルチャを使用するには、C# の補間文字列 を使用し、CultureInfo.InvariantCultureと共に String.Create(IFormatProvider, DefaultInterpolatedStringHandler) に渡します。次に例を示します:
string.Create(CultureInfo.InvariantCulture, $"{major}.{minor}.{build}.{revision}");
どのようなときに警告を抑制するか
既定の形式が適切な選択であり、コードの保守容易性が重要な開発の優先順位でない場合は、この規則による警告を抑制しても問題ありません。
警告を抑制する
単一の違反を抑制するだけの場合は、ソース ファイルにプリプロセッサ ディレクティブを追加して無効にしてから、規則をもう一度有効にします。
#pragma warning disable CA1305
// The code that's violating the rule is on this line.
#pragma warning restore CA1305
ファイル、フォルダー、またはプロジェクトの規則を無効にするには、構成ファイルでその重要度を none
に設定します。
[*.{cs,vb}]
dotnet_diagnostic.CA1305.severity = none
詳細については、「コード分析の警告を抑制する方法」を参照してください。
分析するコードを構成する
次のオプションを使用して、コードベースのどの部分に対してこのルールを実行するかを構成します。
これらのオプションを構成できる対象は、この規則だけ、それを適用するすべての規則、それを適用するこのカテゴリ (グローバリゼーション) のすべての規則のいずれかです。 詳細については、「コード品質規則の構成オプション」を参照してください。
特定のシンボルを除外する
型やメソッドなど、特定のシンボルを分析から除外することができます。 たとえば、MyType
という名前の型のコードで規則を実行しないように指定するには、プロジェクトの .editorconfig ファイルに次のキーと値のペアを追加します。
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType
オプションの値で使用できるシンボル名の形式 (|
で区切ります):
- シンボル名のみ (包含する型または名前空間に関係なく、その名前が指定されたすべてのシンボルが含まれます)。
- そのシンボルのドキュメント ID 形式の完全修飾名。 各シンボル名には、メソッドには
M:
、型にはT:
、名前空間にはN:
のように、シンボルの種類のプレフィックスが必要です。 - コンストラクターには
.ctor
、静的コンストラクターには.cctor
。
例 :
オプション値 | まとめ |
---|---|
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType |
MyType という名前のすべてのシンボルを検索します。 |
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType1|MyType2 |
MyType1 または MyType2 という名前のすべてのシンボルを検索します。 |
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS.MyType.MyMethod(ParamType) |
指定された完全修飾シグネチャを持つ特定のメソッド MyMethod を検索します。 |
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS1.MyType1.MyMethod1(ParamType)|M:NS2.MyType2.MyMethod2(ParamType) |
それぞれの完全修飾シグネチャを持つ特定のメソッド MyMethod1 または MyMethod2 を検索します。 |
特定の型とその派生型を除外する
分析から特定の型とその派生型を除外できます。 たとえば、MyType
という名前の型のメソッドとその派生型で規則を実行しないように指定するには、プロジェクトの .editorconfig ファイルに次のキーと値のペアを追加します。
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType
オプションの値で使用できるシンボル名の形式 (|
で区切ります):
- 型の名前のみ (包含する型または名前空間に関係なく、その名前が指定されたすべての型が含まれます)。
- そのシンボルのドキュメント ID 形式の完全修飾名 (オプションで
T:
プレフィックスも使用可)。
例 :
オプション値 | まとめ |
---|---|
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType |
MyType という名前のすべての型と、そのすべての派生型を検索します。 |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType1|MyType2 |
MyType1 または MyType2 という名前のすべての型と、そのすべての派生型を検索します。 |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS.MyType |
指定された完全修飾名を持つ特定の型 MyType と、そのすべての派生型を検索します。 |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS1.MyType1|M:NS2.MyType2 |
それぞれの完全修飾名を持つ特定の型 MyType1 または MyType2 と、そのすべての派生型を検索します。 |
例
次のコードでは、example1
文字列が規則 CA1305 に違反しています。 example2
文字列は、IFormatProvider を実装する CultureInfo.CurrentCulture を String.Format(IFormatProvider, String, Object) に渡すことによって、規則 CA1305 に準拠します。 example3
文字列は、補間された文字列を CultureInfo.InvariantCulture と共に String.Create(IFormatProvider, DefaultInterpolatedStringHandler) に渡すことによって、規則 CA1305 に準拠します。
string name = "Georgette";
// Violates CA1305
string example1 = string.Format("Hello {0}", name);
// Satisfies CA1305
string example2 = string.Format(CultureInfo.CurrentCulture, "Hello {0}", name);
// Satisfies CA1305
string example3 = string.Create(CultureInfo.InvariantCulture, $"Hello {name}");
関連規則
関連項目
.NET