首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 靜態建構函數初始化靜態成員(二)

     編輯:關於C語言

經典初始化順序陷阱

給定兩個類別:

class A {
    public static int X = B.Y;
    static A() { ++X; }
}
class B {
    public static int Y = A.X;
    static B() { ++Y; }
}

呼叫 Debug.WriteLine(A.X) 與 Debug.WriteLine(B.Y),輸出為 2, 1。

三大分析原則

  1. 程式碼先後順序:較早出現的先執行
  2. 靜態欄位初始化語句 早於 靜態建構函數
  3. 靜態初始化與建構函數 只執行一次

逐步推演

  1. 訪問 A.X → 觸發 A 初始化
  2. A 的欄位初始化 X = B.Y → 觸發 B 初始化
  3. B 的欄位初始化 Y = A.X → 此時 A 尚未完成初始化,A.X 為預設值 0 → Y = 0
  4. 執行 B 靜態建構函數 ++Y → Y = 1
  5. 回到 A 欄位初始化完成,X = 1
  6. 執行 A 靜態建構函數 ++X → X = 2

最終:A.X = 2, B.Y = 1。

單例模式應用

public sealed class Singleton {
    private static readonly Singleton _instance;
    static Singleton() { _instance = new Singleton(); }
    public static Singleton Instance { get { return _instance; } }
    private Singleton() { }
}

靜態建構函數確保執行緒安全、延遲初始化且僅執行一次。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved