共用方式為


CA2211:非常數欄位不應該為可見的

型別名稱

NonConstantFieldsShouldNotBeVisible

CheckId

CA2211

分類

Microsoft.Usage

中斷變更

中斷

原因

公用或保護的靜態欄位既非常數,亦非唯讀。

規則描述

既非常數,亦非唯讀的靜態欄位不是安全執行緒。 必須小心控制對這類欄位的存取,而且需要進階的程式設計技巧同步 (Synchronize) 對類別物件的存取。 因為這些技巧不易學會和精通,而測試這類物件也有困難度,所以最好能用靜態欄位儲存不會變更的資料。 此規則可套用到程式庫,但應用程式不應公開 (Expose) 任何欄位。

如何修正違規

若要修正此規則的違規情形,請將靜態欄位設為常數或唯讀。 如果無法這麼做,請將型別重新設計為使用替代機制,例如管理基礎欄位之安全執行緒存取的安全執行緒屬性。 請注意,如鎖定爭用和死結 (Deadlock) 這類的問題可能會影響程式庫的效能和行為。

隱藏警告的時機

如果您正在開發應用程式,因此對包含靜態欄位之型別的存取具有完全控制,則可以放心地隱藏此規則的警告。 使用非常數的靜態欄位會使程式開發人員難以正確使用程式庫,因此程式庫設計工具不應該隱藏此規則的警告。

範例

下列範例顯示違反此規則的型別。


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