次の方法で共有


CA2241:書式設定メソッドに正しい引数を提供

プロパティ
ルール ID CA2241
Title 書式設定メソッドに正しい引数を提供
[カテゴリ] 使用方法
修正が中断ありか中断なしか なし
.NET 8 では既定で有効 提案として

原因

メソッドに渡される format 文字列引数 (WriteLineWriteSystem.String.Format など) に、各オブジェクト引数に対応する書式指定項目が含まれていません (その逆も考えられます)。

既定では、この規則で分析されるのは、前に説明した 3 つのメソッドの呼び出しのみです。しかし、これは構成可能です。

規則の説明

メソッドへの引数 (WriteLineWriteFormat など) は、書式指定文字列とその後に続く複数の System.Object インスタンスから成ります。 書式指定文字列は、テキストと、フォーム {index[,alignment][:formatString]} の埋め込み書式指定項目からなります。 'index' は、どのオブジェクトを書式設定するかを示す、0 から始まる整数です。 オブジェクトの書式指定文字列に対応するインデックスがない場合、そのオブジェクトは無視されます。 'Index' によって指定されたオブジェクトが存在しない場合は、実行時に System.FormatException がスローされます。

違反の修正方法

この規則違反を修正するには、オブジェクトの引数ごとに書式指定項目を指定し、書式指定項目ごとにオブジェクトの引数を指定します。

どのようなときに警告を抑制するか

この規則による警告は抑制しないでください。

分析するコードを構成する

この規則を実行する追加のメソッドを構成するには、次のオプションを使用します。

追加の文字列書式指定メソッド

この規則によって分析する必要がある追加の文字列書式指定メソッドの名前を構成できます。 たとえば、MyFormat という名前のすべてのメソッドを文字列書式指定メソッドとして指定するには、プロジェクトの .editorconfig ファイルに次のキーと値のペアを追加します。

dotnet_code_quality.CA2241.additional_string_formatting_methods = MyFormat

オプションの値で使用できるメソッド名の形式 (| で区切ります):

  • メソッド名のみ (包含する型または名前空間に関係なく、その名前が指定されたすべてのメソッドが含まれます)
  • そのシンボルのドキュメント ID 形式の完全修飾名 (オプションで M: プレフィックスも使用可)。

例 :

オプション値 まとめ
dotnet_code_quality.CA2241.additional_string_formatting_methods = MyFormat コンパイル時に、MyFormat という名前が付けられたすべてのメソッドを照合します。
dotnet_code_quality.CA2241.additional_string_formatting_methods = MyFormat1|MyFormat2 コンパイル時に、MyFormat1 または MyFormat2 のいずれかの名前が付けられたすべてのメソッドを照合します。
dotnet_code_quality.CA2241.additional_string_formatting_methods = NS.MyType.MyFormat(ParamType) 指定された完全修飾シグネチャを持つ特定の MyFormat メソッドを照合します。
dotnet_code_quality.CA2241.additional_string_formatting_methods = NS1.MyType1.MyFormat1(ParamType)|NS2.MyType2.MyFormat2(ParamType) それぞれ完全修飾シグネチャを持つ特定の MyFormat1 および MyFormat2 メソッドを照合します。

追加の文字列書式指定メソッドを自動的に決定する

追加の文字列書式指定メソッドの明示的なリストを指定するのでなく、文字列書式指定メソッドの決定が自動的に試行されるようにアナライザーを構成できます。 既定では、このオプションは無効になっています。 このオプションが有効になっている場合、string format パラメーターの後に params object[] パラメーターが指定されているメソッドは、文字列書式指定メソッドと見なされます。

dotnet_code_quality.CA2241.try_determine_additional_string_formatting_methods_automatically = true

次の例に、2 つの規則違反を示します。

Imports System

Namespace ca2241

    Class CallsStringFormat

        Sub CallFormat()

            Dim file As String = "file name"
            Dim errors As Integer = 13

            ' Violates the rule.
            Console.WriteLine(String.Format("{0}", file, errors))

            Console.WriteLine(String.Format("{0}: {1}", file, errors))

            ' Violates the rule and generates a FormatException at runtime.
            Console.WriteLine(String.Format("{0}: {1}, {2}", file, errors))

        End Sub

    End Class

End Namespace
class CallsStringFormat
{
    void CallFormat()
    {
        string file = "file name";
        int errors = 13;

        // Violates the rule.
        Console.WriteLine(string.Format("{0}", file, errors));

        Console.WriteLine(string.Format("{0}: {1}", file, errors));

        // Violates the rule and generates a FormatException at runtime.
        Console.WriteLine(string.Format("{0}: {1}, {2}", file, errors));
    }
}