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;
   }
}