首頁 > 後端開發 > C++ > C# 的靜態類別初始化順序是可預測的嗎?

C# 的靜態類別初始化順序是可預測的嗎?

DDD
發布: 2025-01-04 20:15:41
原創
860 人瀏覽過

Is C#'s Static Class Initialization Order Predictable?

C# 中的靜態類別初始化順序是確定性的嗎?

C# 中靜態類別初始化的順序確實是確定性的。根據 ECMA-334 標準:

  • 靜態欄位初始值設定項在靜態建構子之前立即執行。
  • 靜態建構子的執行由第一次使用靜態欄位觸發或當建立類別的實例時。
  • 如果類別包含Main(),則其靜態建構子在Main() 之前運行

初始化順序範例

考慮以下代碼:

static class B
{
    public static int X = 7;
    static B()
    {
        Console.WriteLine("B.X = " + X);
        X = A.X;
        Console.WriteLine("B.X = " + X);
    }
}

static class A
{
    public static int X = B.X + 1;
    static A() { Console.WriteLine("A.X = " + X); }
}

static class Program
{
    static void Main()
    {
        Console.WriteLine("A = {0}, B = {1}", A.X, B.X);
    }
}
登入後複製

執行順序

  1. Main() 中使用了A.X,觸發A().
  2. A().X初始化需要B.X,呼叫B().
  3. B(). X初始化為7(Console.WriteLine("B.X = 7")).
  4. B().X被修改並且 Console.WriteLine("B.X = 0") 被修改執行。
  5. A().X 設定為 B.X 1 (Console.WriteLine("A.X = 1"))。
  6. Console.WriteLine("A = 1, B = 0" ) 輸出。

重新排列注意事項

即使重新排列A 類和B 類,初始化的順序仍然保持不變,因為第一次使用A.X 會觸發初始化鏈。

結論

靜態類別初始化的順序是確定的,並遵循 ECMA-334 標準中概述的規則。第一次使用靜態成員或建立實例將觸發初始化過程,該過程按照欄位初始值設定項後跟靜態建構函數的順序進行。

以上是C# 的靜態類別初始化順序是可預測的嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板