靜態建構函式是 C# 獨特機制,專門用於類別層級的一次性初始化。它不屬於任何實例,而是屬於類別本身,在建立第一個實例或存取任何靜態成員前,由 CLR 自動執行恰好一次。本文完整說明語法、七大特性、常見陷阱與最佳實務。
class SimpleClass
{
// 靜態建構函式
static SimpleClass()
{
// 初始化靜態欄位、設定靜態資源等
}
}
| # | 特性 | 說明 |
|---|---|---|
| 1 | 無存取修飾符、無參數 | 由 CLR 呼叫,public/private 無意義;無法手動呼叫,故無參數 |
| 2 | 自動觸發時機 | 建立第一個實例 或 存取任一靜態成員前,CLR 自動執行 |
| 3 | 每個類別僅一個 | 不可多載,不可重複定義 |
| 4 | 可與無參數實例建構函式共存 | 雖參數列表相同(皆為空),但一個屬於類別、一個屬於實例,不衝突 |
| 5 | 最多執行一次 | AppDomain 存續期間僅執行一次,執行後不再觸發 |
| 6 | 不可繼承 | 子類別不會繼承父類別的靜態建構函式 |
| 7 | 編譯器自動生成預設 | 若類別有「帶初始值的靜態欄位」且未顯式定義靜態建構函式,編譯器會自動生成一個 |
class Demo
{
static Demo()
{
Console.WriteLine("靜態建構函式執行");
}
public static string StaticProp = "靜態屬性";
public Demo()
{
Console.WriteLine("實例建構函式執行");
}
}
// 測試
Console.WriteLine("--- 存取靜態屬性 ---");
var s = Demo.StaticProp; // 觸發靜態建構函式
Console.WriteLine("--- 建立實例 ---");
var d = new Demo(); // 靜態建構函式已執行,不再觸發
--- 存取靜態屬性 ---
靜態建構函式執行
--- 建立實例 ---
實例建構函式執行
Lazy<T> 更佳)會導致 TypeInitializationException,且該類別在該 AppDomain 永久無法使用。
類別間靜態建構函式執行順序不確定,若 A 依賴 B 的靜態欄位,可能 B 尚未初始化。
阻塞型別首次使用的執行緒,影響啟動效能。
class Config
{
// 簡單初始化用欄位初始化器
public static readonly string AppName = "MyApp";
public static readonly int MaxConnections = 100;
// 複雜邏輯用靜態建構函式
static Config()
{
// 讀取組態檔、建立查找表等
ConnectionStrings = LoadFromConfig();
}
public static Dictionary ConnectionStrings { get; private set; }
}
靜態建構函式是「類別級初始化」的標準機制,特性明確、限制清晰。掌握其自動觸發、單次執行、無參無修飾符等核心規則,配合欄位初始化器使用,能安全高效完成靜態資源初始化。