靜態建構函數 (static Constructor) 屬於類別本身,而非實例。它在建立第一個實例或存取任何靜態成員之前,由 CLR 自動呼叫恰好一次,用於初始化靜態欄位或執行一次性設定邏輯。
public class MyClass
{
// 靜態建構函數
static MyClass()
{
// 初始化靜態欄位
ConnectionString = LoadConfig();
Log.Info("類別初始化完成");
}
// 實例建構函數
public MyClass() { ... }
public static string ConnectionString { get; private set; }
}
| 特性 | 說明 |
|---|---|
| 修飾詞 | 無 public/private 等存取修飾詞 (CLR 呼叫,非使用者代碼) |
| 參數 | 不可有參數 |
| 呼叫時機 | 類別首次被使用前 (建立實例、存取靜態成員、反射) |
| 執行次數 | 每個應用程式域僅執行一次 |
| 繼承 | 不可繼承,衍生類別有自己的靜態建構函數 |
| 共存 | 可與無參數實例建構函數共存 (簽章不同:一個屬類別、一個屬實例) |
| 預設行為 | 若類別有帶初始值的靜態欄位,編譯器會自動產生預設靜態建構函數 |
class Base
{
static Base() { Console.WriteLine("Base 靜態建構"); }
public Base() { Console.WriteLine("Base 實例建構"); }
}
class Derived : Base
{
static Derived() { Console.WriteLine("Derived 靜態建構"); }
public Derived() { Console.WriteLine("Derived 實例建構"); }
}
// 執行:
var d = new Derived();
// 輸出順序:
// Base 靜態建構
// Derived 靜態建構
// Base 實例建構
// Derived 實例建構
TypeInitializationException,且該類別在該應用程式域中永久不可用。