sealed 修飾詞用於方法時,精確禁止衍生類覆寫該虛方法,同時保留類別可繼承性。語法規則:必須配合 override,即 sealed override。
class A {
public virtual void F() { Console.WriteLine("A.F"); }
public virtual void G() { Console.WriteLine("A.G"); }
}
class B : A {
public sealed override void F() { Console.WriteLine("B.F"); } // 密封:禁止進一步覆寫
public override void G() { Console.WriteLine("B.G"); } // 仍可覆寫
}
class C : B {
// public override void F() {} // 編譯錯誤:F 已密封
public override void G() { Console.WriteLine("C.G"); } // 正常
}
volatile 與 lock 實現執行緒安全單例
public sealed class Singleton {
private static volatile Singleton _instance;
private static readonly object _syncRoot = new();
private Singleton() {} // 私有建構函式
public static Singleton Instance {
get {
if (_instance == null) { // 第一次檢查:無鎖快速路徑
lock (_syncRoot) { // 鎖定同步物件(非 this)
if (_instance == null) // 第二次檢查:確保單一建立
_instance = new Singleton();
}
}
return _instance;
}
}
}
關鍵細節:
volatile:防止指令重排序導致部分建構物件發布lock(_syncRoot):專用同步物件,避免 lock(this) 死鎖風險sealed class:防止繼承破壞單例語義雙重檢查鎖定依賴記憶體模型保證。在 C#/.NET 有效,但在 C++/Java 舊版本中因編譯器優化/記憶體模型差異可能失效。現代 C++11 std::atomic、Java 5+ volatile 已修正。
// 靜態建構函式:CLR 保證執行緒安全、延遲初始化、僅執行一次
public sealed class Singleton {
private static readonly Singleton _instance = new();
private Singleton() {}
public static Singleton Instance => _instance;
}
此為推薦預設方案:簡潔、正確、效能佳,無需手寫鎖定。
密封方法是精準控制繼承行為的手術刀,善用於關鍵路徑鎖定與模式實現輔助。