CA2211:非定数フィールドは表示されません
プロパティ | 値 |
---|---|
ルール ID | CA2211 |
Title | 非定数フィールドは表示されません |
[カテゴリ] | 使用方法 |
修正が中断ありか中断なしか | あり |
.NET 8 では既定で有効 | 提案として |
原因
public または protected の静的フィールドが不変ではなく、読み取り専用でもありません。
規則の説明
定数でも読み取り専用でもない静的フィールドは、スレッド セーフではありません。 このようなフィールドへのアクセスは、慎重に制御してください。また、クラス オブジェクトへのアクセスを同期するには、高度なプログラミング技術が必要です。 このようなテクノロジを習得してマスターするのは難しく、そのようなオブジェクトをテストするのも困難なため、静的フィールドは変更されないデータを格納するために使用するのが最適です。 この規則はライブラリに適用されます。アプリケーションではフィールドを公開しないでください。
違反の修正方法
この規則違反を修正するには、静的フィールドを定数または読み取り専用にします。 これが不可能な場合は、基となるフィールドへのスレッドセーフ アクセスを管理するスレッドセーフ プロパティなどの代替メカニズムを使用するように型を再設計してください。 ロックの競合やデッドロックなどの問題は、ライブラリのパフォーマンスや動作に影響する可能性があることを認識してください。
どのようなときに警告を抑制するか
アプリケーションを開発していて、静的フィールドを含む型へのアクセスを完全に制御できる場合は、この規則の警告を抑制しても問題ありません。 ライブラリの設計者は、この規則による警告を抑制すべきではありません。定数ではない静的フィールドを使用すると、開発者がライブラリを正しく使用することが困難になる可能性があります。
警告を抑制する
単一の違反を抑制するだけの場合は、ソース ファイルにプリプロセッサ ディレクティブを追加して無効にしてから、規則をもう一度有効にします。
#pragma warning disable CA2211
// The code that's violating the rule is on this line.
#pragma warning restore CA2211
ファイル、フォルダー、またはプロジェクトの規則を無効にするには、構成ファイルでその重要度を none
に設定します。
[*.{cs,vb}]
dotnet_diagnostic.CA2211.severity = none
詳細については、「コード分析の警告を抑制する方法」を参照してください。
例
次の例からは、この規則に違反する型を確認できます。
Imports System
Namespace ca2211
Public Class SomeStaticFields
' Violates rule: AvoidNonConstantStatic;
' the field is public and not a literal.
Public Shared publicField As DateTime = DateTime.Now
' Satisfies rule: AvoidNonConstantStatic.
Public Shared ReadOnly literalField As DateTime = DateTime.Now
' Satisfies rule: NonConstantFieldsShouldNotBeVisible;
' the field is private.
Private Shared privateField As DateTime = DateTime.Now
End Class
End Namespace
public class SomeStaticFields
{
// Violates rule: AvoidNonConstantStatic;
// the field is public and not a literal.
static public DateTime publicField = DateTime.Now;
// Satisfies rule: AvoidNonConstantStatic.
public static readonly DateTime literalField = DateTime.Now;
// Satisfies rule: NonConstantFieldsShouldNotBeVisible;
// the field is private.
static DateTime privateField = DateTime.Now;
}
.NET