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

C# 靜態建構函數深度解析

     編輯:關於C#

什麼是靜態建構函數?

靜態建構函數 (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 實例建構

常見應用場景

  • 單例模式:利用靜態建構函數的執行時機保證線程安全延遲初始化。
  • 非托管資源初始化:載入原生 DLL、初始化靜態緩衝區。
  • 靜態集合填充:建立查找表、快取字典。
  • 設定檔讀取:一次性讀取組態至靜態屬性。

注意事項

  • 靜態建構函數拋出異常會導致 TypeInitializationException,且該類別在該應用程式域中永久不可用。
  • 避免在靜態建構函數中執行耗時操作或可能死鎖的同步呼叫。
  • 不要依賴靜態建構函數的具體執行時間點 (BeforeFieldInit 行為可能受編譯器優化影響)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved