CA1802:適切な場所にリテラルを使用します

プロパティ
ルール ID CA1802
Title 適切な場所にリテラルを使用します
[カテゴリ] パフォーマンス
修正が中断ありか中断なしか なし
.NET 8 では既定で有効 いいえ

原因

フィールドが static および readonly (Visual Basic では Shared および ReadOnly) として宣言され、コンパイル時に計算できる値によって初期化されています。

デフォルトでは、この規則の対象は外部から参照可能な静的で読み取り専用のフィールドのみですが、これは構成可能です。

規則の説明

static readonly フィールドの値は、宣言する型の静的コンストラクターが呼び出されるときに、実行時に計算されます。 static readonly フィールドが宣言時に初期化され、静的コンストラクターが明示的に宣言されていない場合、コンパイラは静的コンストラクターを生成してフィールドを初期化します。

const フィールドの値はコンパイル時に計算され、メタデータに格納されます。これにより、static readonly フィールドと比較すると実行時のパフォーマンスが向上します。

対象フィールドに代入された値はコンパイル時に計算できるので、宣言を const フィールドに変更して、値が実行時ではなくコンパイル時に計算されるようにします。

違反の修正方法

この規則違反を修正するには、static および readonly 修飾子を const 修飾子で置き換えます。

注意

すべてのシナリオで const 修飾子の使用は推奨されていません。

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

パフォーマンスが問題にならない場合は、この規則による警告を抑制したり、規則を無効にしたりしても問題ありません。

警告を抑制する

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

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

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

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

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

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

次のオプションを使用して、コードベースのどの部分に対してこの規則を実行するかを構成します。

このオプションを構成できる対象は、この規則だけ、それを適用できるすべての規則、それを適用できるこのカテゴリ (パフォーマンス) のすべての規則です。 詳細については、「コード品質規則の構成オプション」を参照してください。

特定の API サーフェイスを含める

ユーザー補助に基づいて、この規則を実行するコードベースの部分を構成できます。 たとえば、非パブリック API サーフェイスでのみ規則を実行するように指定するには、プロジェクトの .editorconfig ファイルに次のキーと値のペアを追加します。

dotnet_code_quality.CAXXXX.api_surface = private, internal

必須の修飾子

この規則を構成して、必須のフィールド修飾子をオーバーライドできます。 既定では、staticreadonly は両方とも、分析されるフィールドの必須の修飾子です。 これは、次の表に示す 1 つ以上の修飾子の値を、コンマで区切って指定することによってオーバーライドできます。

オプション値 まとめ
none 修飾子の要件なし
static または Shared "static" (Visual Basic では "Shared") として宣言する必要があります。
const "const" として宣言する必要があります。
readonly "readonly" として宣言する必要があります。

たとえば、static と instance の両方フィールドに対して規則を実行しないように指定するには、プロジェクトの .editorconfig ファイルに次のキーと値のペアを追加します。

dotnet_code_quality.CA1802.required_modifiers = none

次の例では、この規則に違反する型 UseReadOnly と、この規則に準拠する型 UseConstant を確認できます。

Imports System

Namespace ca1802

    ' This class violates the rule.
    Public Class UseReadOnly

        Shared ReadOnly x As Integer = 3
        Shared ReadOnly y As Double = x + 2.1
        Shared ReadOnly s As String = "readonly"

    End Class

    ' This class satisfies the rule.
    Public Class UseConstant

        Const x As Integer = 3
        Const y As Double = x + 2.1
        Const s As String = "const"

    End Class

End Namespace
// This class violates the rule.
public class UseReadOnly
{
    static readonly int x = 3;
    static readonly double y = x + 2.1;
    static readonly string s = "readonly";

    public void Print()
    {
        Console.WriteLine(s);
    }
}

// This class satisfies the rule.
public class UseConstant
{
    const int x = 3;
    const double y = x + 2.1;
    const string s = "const";
}