CA2207: 必須將值類型的靜態欄位行內初始化

屬性
規則識別碼 CA2207
職稱 必須將實值類型的靜態欄位在線初始化
類別 使用方式
修正是造成中斷還是不中斷 不中斷
在 .NET 10 中預設啟用
適用語言 C# 與 Visual Basic

原因

實值型別會宣告明確的靜態建構函式。

規則描述

宣告實值類型時,它會進行預設初始化,其中所有實值類型欄位都設定為零,而且所有參考類型字段都會設定為 nullNothing 在 Visual Basic 中)。 明確的靜態建構函式只保證在呼叫該型別的實例建構函式或靜態成員之前執行。 因此,如果在未呼叫實例建構函式的情況下建立類型,則不保證會執行靜態建構函式。

如果所有靜態數據都是內嵌初始化,而且不會宣告任何明確的靜態建構函式,C# 和 Visual Basic 編譯程式會將旗標新增 beforefieldinit 至 CIL 類別定義。 編譯程式也會新增包含靜態初始化程序代碼的私人靜態建構函式。 此私有的靜態建構函式確保在類型的任何靜態欄位被存取之前執行。

如何修正違規

若要修正此規則的違規,請在宣告並移除靜態建構函式時,初始化所有靜態數據。

Example

// This struct violates the rule.
struct BadStruct
{
    private static readonly int s_first;
    private static readonly int s_second;

    static BadStruct()
    {
        s_first = 1;
        s_second = 2;
    }

    // ...
}

// This struct satisfies the rule.
struct GoodStruct
{
    private static readonly int s_first = 1;
    private static readonly int s_second = 2;

    // ...
}

隱藏警告的時機

請勿隱藏此規則的警告。

CA1810: 將參考類型的靜態欄位內聯初始化