class SimpleClass {
static SimpleClass() { // 無修飾詞、無參數、無回傳型別
// 初始化靜態欄位、執行一次性設定
}
}
public/private 無意義。
class Base {
static Base() => Console.WriteLine("Base 靜態建構");
public static int BaseStatic = 1;
}
class Derived : Base {
static Derived() => Console.WriteLine("Derived 靜態建構");
public static int DerivedStatic = 2;
}
Console.WriteLine(Derived.DerivedStatic);
// 輸出:
// Base 靜態建構
// Derived 靜態建構
// 2
若類別包含帶初始值的靜態欄位且未定義靜態建構函式,編譯器會自動產生一個預設靜態建構函式執行初始化。
- 例外傳播:靜態建構函式拋出例外會導致
TypeInitializationException,且該類別在該 AppDomain 永久不可用(後續存取皆拋出同例外)。務必try/catch內部錯誤或避免拋出。- 循環相依:A 靜態建構呼叫 B 靜態成員,B 靜態建構又呼叫 A → 死鎖或例外。
- 效能:靜態建構函式會增加類別首次使用的延遲;大量初始化考慮
Lazy<T>或延遲到首次實際使用。- 測試困難:難以模擬/重置,單元測試時考慮改用靜態工廠方法或依賴注入。
public sealed class Singleton {
private Singleton() { }
public static Singleton Instance { get; } = new Singleton(); // C# 6+ 唯讀自動屬性,CLR 保證執行緒安全
}
此寫法利用靜態建構函式特性,比雙重檢查鎖定更簡潔可靠。