| プロパティ | 値 |
|---|---|
| ルール ID | CA1802 |
| Title | 適切な場所にリテラルを使用します |
| [カテゴリ] | パフォーマンス |
| 修正が中断ありか中断なしか | なし |
| .NET 10 で既定で有効 | いいえ |
原因
フィールドが static および readonly (Visual Basic では Shared および ReadOnly) として宣言され、コンパイル時に計算できる値によって初期化されています。
デフォルトでは、この規則の対象は外部から参照可能な静的で読み取り専用のフィールドのみですが、これは構成可能です。
規則の説明
static readonly フィールドの値は、宣言する型の静的コンストラクターが呼び出されたときに実行時に計算されます。
static readonly フィールドが宣言時に初期化され、静的コンストラクターが明示的に宣言されていない場合、コンパイラは静的コンストラクターを生成してフィールドを初期化します。
const フィールドの値はコンパイル時に計算され、メタデータに格納されるため、static readonly フィールドと比較すると実行時のパフォーマンスが向上します。
ターゲット フィールドに割り当てられた値はコンパイル時に計算できるため、宣言を const フィールドに変更して、実行時ではなくコンパイル時に値が計算されるようにします。
違反の修正方法
この規則違反を修正するには、static および readonly 修飾子を const 修飾子で置き換えます。
注意
すべてのシナリオで const 修飾子の使用は推奨されていません。
どのようなときに警告を抑制するか
パフォーマンスが問題にならない場合は、この規則による警告を抑制したり、規則を無効にしたりしても問題ありません。
警告
パブリック メンバーまたは外部から参照可能なメンバーの場合、static readonly を const に変更すると問題が発生する可能性があります。
const 値はコンパイル時に依存アセンブリに埋め込まれるため、ライブラリの値の変更が反映されず、エラーが発生する可能性があります。 メンバーの値が将来変更される可能性がある場合は、このルールを抑制します。
注意
const の使用は private メンバーにとって安全であり、internal を介して公開または個別にデプロイしない限り、一般的に InternalsVisibleTo メンバーにとって安全です。
警告を抑制する
単一の違反を抑制するだけの場合は、ソース ファイルにプリプロセッサ ディレクティブを追加して無効にしてから、規則をもう一度有効にします。
#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_surface オプションを設定することで、アクセスの可否に基づいてこのルールを実行するコードベースの部分を構成できます。 たとえば、非パブリック API サーフェイスでのみ規則を実行するように指定するには、プロジェクトの .editorconfig ファイルに次のキーと値のペアを追加します。
dotnet_code_quality.CAXXXX.api_surface = private, internal
注意
XXXX の CAXXXX 部分を該当するルールの ID に置き換えます。
必須の修飾子
この規則を構成して、必須のフィールド修飾子をオーバーライドできます。 既定では、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