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

屬性
規則識別碼 CA2211
標題 非常數欄位不應該為可見的
類別 使用方式
修正程式是中斷或非中斷 中斷
預設在 .NET 8 中啟用 建議

原因

公用或受保護的靜態欄位不是固定的,也不是唯讀的。

檔案描述

既非常數,亦非唯讀的靜態欄位不是安全執行緒。 必須仔細控制這類欄位的存取權,而且需要進階程式設計技術,才能同步處理類別物件的存取權。 由於這些是難以學習的技能,而且測試這類物件會帶來自己的挑戰,因此靜態欄位最適合用來儲存不會變更的資料。 此規則適用于程式庫;應用程式不應該公開任何欄位。

如何修正違規

若要修正此規則的違規,請讓靜態欄位常數或唯讀。 如果無法這樣做,請重新設計類型以使用替代機制,例如管理基礎欄位安全線程存取的執行緒安全屬性。 瞭解鎖定爭用和死結等問題可能會影響程式庫的效能和行為。

隱藏警告的時機

如果您正在開發應用程式,因此可以完全控制包含靜態欄位之類型的存取權,則隱藏此規則的警告是安全的。 程式庫設計工具不應隱藏此規則的警告;使用非常數靜態欄位可能會讓開發人員難以正確使用程式庫。

隱藏警告

如果您只想要隱藏單一違規,請將預處理器指示詞新增至原始程式檔以停用,然後重新啟用規則。

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