class A
{
public static int X;
static A() { X = B.Y + 1; }
}
class B
{
public static int Y = A.X + 1;
static B() { }
static void Main()
{
Console.WriteLine($"X={A.X}, Y={B.Y}"); // 輸出:X=1, Y=2
}
}
Main 在 B 中 → 首次訪問 B 觸發 B 靜態初始化。B 靜態字段聲明:Y = A.X + 1 → 需訪問 A.X。A → 觸發 A 靜態初始化。
A 靜態字段 X 無初始化器 → 默認 0。A 靜態構造函數:X = B.Y + 1 → 再次訪問 B.Y。B 正在初始化中,不會重入 靜態初始化 → B.Y 仍為默認值 0。A.X = 0 + 1 = 1,A 初始化完成。B 字段初始化器:Y = A.X + 1 = 1 + 1 = 2。B 靜態構造函數執行(空)。Main 繼續,輸出 X=1, Y=2。注意:字段初始化器在構造函數之前執行,且從基類到派生類。這與靜態初始化「首次訪問觸發」不同,實例初始化是確定性順序。
new。Lazy<T> 或雙重檢查鎖)。