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

C# 密封方法:防止覆寫的精準控制與雙重檢查鎖定單例模式支援

     編輯:關於C#

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"); }       // 正常
}

設計意圖

  1. 鎖定關鍵演算法:核心邏輯(如加密、序列化、協定解析)禁止子類竄改
  2. 效能優化:JIT 可對密封方法去虛擬化內聯
  3. 單例模式雙重檢查鎖定:配合 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 已修正。

替代方案:.NET 執行期保證單例


// 靜態建構函式:CLR 保證執行緒安全、延遲初始化、僅執行一次
public sealed class Singleton {
    private static readonly Singleton _instance = new();
    private Singleton() {}
    public static Singleton Instance => _instance;
}

此為推薦預設方案:簡潔、正確、效能佳,無需手寫鎖定。

密封方法是精準控制繼承行為的手術刀,善用於關鍵路徑鎖定與模式實現輔助。

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