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

C# 靜態建構函式詳細解析:執行時機、限制與最佳實務

     編輯:關於C#

定義與語法

class SimpleClass {
    static SimpleClass() {  // 無修飾詞、無參數、無回傳型別
        // 初始化靜態欄位、執行一次性設定
    }
}

七大關鍵特性

  1. 無存取修飾詞:由 CLR 自動呼叫,public/private 無意義。
  2. 無參數:無法傳遞引數。
  3. 自動觸發時機:建立第一個實例 或 存取任何靜態成員 之前,由 CLR 保證執行一次。
  4. 不可手動呼叫:無法在代碼中顯式呼叫。
  5. 每個類別最多一個:重複定義編譯錯誤。
  6. 可與無參數實例建構函式共存:屬於類別 vs 屬於實例,不衝突。
  7. 不被繼承:衍生類別有自己的靜態建構函式,父類靜態建構函式在子類第一次存取靜態成員前執行。

執行順序示例


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

編譯器自動產生

若類別包含帶初始值的靜態欄位且未定義靜態建構函式,編譯器會自動產生一個預設靜態建構函式執行初始化。

常見用途

  • 初始化靜態集合、快取、單例模式的靜態實例
  • 設定靜態資源(登錄表讀取、組態檔解析、原生 DLL 載入)
  • 執行一次性驗證、授權檢查

避坑指南

  • 例外傳播:靜態建構函式拋出例外會導致 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 保證執行緒安全
}

此寫法利用靜態建構函式特性,比雙重檢查鎖定更簡潔可靠。

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