CA2211: 非定数フィールドは表示されません
TypeName |
NonConstantFieldsShouldNotBeVisible |
CheckId |
CA2211 |
カテゴリ |
Microsoft.Usage |
互換性に影響する変更点 |
あり |
原因
パブリックまたはプロテクトの静的フィールドが、定数でも読み取り専用でもありません。
規則の説明
定数でも読み取り専用でもない静的フィールドは、スレッド セーフではありません。 このようなフィールドへのアクセスは、慎重に制御してください。また、クラス オブジェクトへのアクセスを同期するには、高度なプログラミング技術が必要です。 この制御は習得が困難なスキルで、このようなオブジェクトのテストには固有の難しさがあるため、静的フィールドは変化しないデータを格納するときに使用することが最適です。 この規則はライブラリに適用されます。アプリケーションではフィールドを公開しないでください。
違反の修正方法
この規則違反を修正するには、静的フィールドを定数または読み取り専用にします。 それができない場合は、型を再デザインし、別の機構を使用します。たとえば、スレッド セーフのプロパティなどで、基になるフィールドに対してスレッド セーフのアクセスを管理する方法です。 ロックの競合やデッドロックなどの問題は、ライブラリのパフォーマンスと動作に影響を及ぼす可能性があります。
警告を抑制する状況
アプリケーションを開発しているため、静的フィールドを含む型に対してフル コントロール アクセス権を持つ場合は、この規則による警告を抑制しても安全です。 ライブラリをデザインしている場合は、この規則による警告を抑制しないでください。定数ではない静的フィールドを使用すると、ライブラリを適切に開発することが困難になります。
使用例
この規則に違反する型を次の例に示します。
Imports System
Namespace UsageLibrary
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
using System;
namespace UsageLibrary
{
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;
}
}