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

Effective C# 原則 13:以靜態建構函式初始化靜態成員

     編輯:關於C#

類別的靜態成員必須在任何實例建立前完成初始化。C# 提供靜態欄位初始化運算式與靜態建構函式兩種機制,確保時機正確、執行一次、異常可控。

靜態欄位初始化運算式:簡單分配首選

public class MySingleton
{
    private static readonly MySingleton _instance = new MySingleton();
    public static MySingleton Instance => _instance;
    private MySingleton() { }
}

靜態建構函式:複雜邏輯與異常處理

public class MySingleton
{
    private static readonly MySingleton _instance;
    static MySingleton()
    {
        try { _instance = new MySingleton(); }
        catch { /* 復原邏輯 */ }
    }
    public static MySingleton Instance => _instance;
    private MySingleton() { }
}

執行時機與順序

  • CLR 在型別首次被存取前自動呼叫靜態建構函式(精確時機由實作決定)。
  • 靜態欄位初始化運算式 先於 靜態建構函式執行。
  • 基類靜態建構函式 先於 衍生類靜態建構函式執行。
  • 全程序僅執行一次,線程安全由 CLR 保證。

關鍵限制

  • 無參數、無存取修飾詞、不可手動呼叫。
  • 若靜態建構函式拋出未處理例外,CLR 會終止整個應用程式(TypeInitializationException 包裝原始例外)。因此必須在靜態建構函式內捕獲並處理所有例外,或改用欄位初始化運算式(但無法捕獲例外)。

選擇指南

  • 簡單新增物件 → 靜態欄位初始化運算式。
  • 需複雜邏輯、外部資源存取、或必須捕獲例外 → 靜態建構函式。
  • 單例模式、靜態快取、效能計數器註冊等皆適用。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved