類別的靜態成員必須在任何實例建立前完成初始化。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() { }
}
TypeInitializationException 包裝原始例外)。因此必須在靜態建構函式內捕獲並處理所有例外,或改用欄位初始化運算式(但無法捕獲例外)。