CA1861: 引数として定数配列を使用しない

プロパティ
ルール ID CA1861
Title 引数として定数配列を使用しない
[カテゴリ] パフォーマンス
修正が中断ありか中断なしか なし
.NET 8 では既定で有効 提案として

原因

通常の呼び出しまたは拡張メソッド呼び出しを介してメソッドに渡される、リテラル値の定数配列。

規則の説明

引数として渡される定数配列は、繰り返し呼び出された場合に再利用されません。これは、新しい配列が毎回作成されることを意味します。 渡された配列が呼び出されたメソッド内で変更されていない場合は、パフォーマンス向上のために、それを static readonly フィールドに抽出することを検討してください。

注意

呼び出されたメソッドが渡された配列を変更する場合、またはメソッドが配列を変更するかどうかがわからない場合は、配列を static readonly フィールドに抽出しないでください。 これは、破壊的変更になる可能性があります。 この場合は、代わりに警告を抑制することをお勧めします。

違反の修正方法

渡された配列が呼び出されたメソッド内で変更されていない場合は、定数配列を static readonly フィールドに抽出します。

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

// A method argument
string message = string.Join(" ", new[] { "Hello", "world!" });
' A method argument
Dim message As String = String.Join(" ", {"Hello", "world!"})

次の例は、引数を static readonly フィールドに抽出することでこの規則の違反がどのように修正されるかを示しています。

private static readonly string[] array = new[] { "Hello" , "world!" };

private string GetMessage()
{
    return string.Join(" ", array);
}
Private Shared ReadOnly array As String() = {"Hello", "world!"}

Private Function GetMessage() As String
    Return String.Join(" ", array)
End Function

これで、実行時ではなくコンパイル時に配列の値が解決され、コードのパフォーマンスが向上します。

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

次の場合に、この規則の違反を抑制します。

  • 呼び出しは 1 回だけ実行される。
  • 配列が、呼び出されたメソッド内で変更される可能性があるか、変更されるかどうかわからない。
  • 各呼び出しについて、定数配列を作成することによるパフォーマンスへの影響が懸念されない。

警告を抑制する

単一の違反を抑制するだけの場合は、ソース ファイルにプリプロセッサ ディレクティブを追加して無効にしてから、規則をもう一度有効にします。

#pragma warning disable CA1861
// The code that's violating the rule is on this line.
#pragma warning restore CA1861

ファイル、フォルダー、またはプロジェクトの規則を無効にするには、構成ファイルでその重要度を none に設定します。

[*.{cs,vb}]
dotnet_diagnostic.CA1861.severity = none

詳細については、「コード分析の警告を抑制する方法」を参照してください。