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

C# 靜態建構函式完整指南:特性、執行時機、限制與最佳實務

     編輯:關於C語言

前言

靜態建構函式是 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; }
}

總結

靜態建構函式是「類別級初始化」的標準機制,特性明確、限制清晰。掌握其自動觸發、單次執行、無參無修飾符等核心規則,配合欄位初始化器使用,能安全高效完成靜態資源初始化。

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