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
必須の修飾子
この規則を構成して、必須のフィールド修飾子をオーバーライドできます。 既定では、static
と readonly
は両方とも、分析されるフィールドの必須の修飾子です。 これは、次の表に示す 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";
}
.NET