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

C# 密封類別:阻止繼承濫用、啟用執行期優化的架構邊界工具

     編輯:關於C#

sealed class 在類別宣告加上 sealed,徹底禁止繼承。這是架構層級的「最終形態」宣告。

核心規則

  • sealed class 不可作為基類:class C : SealedClass → 編譯錯誤
  • sealed 與 abstract 互斥:抽象類別旨在被繼承,密封類別旨在不被繼承
  • 結構隱含密封(不可繼承),但不可加 sealed 關鍵字

適用場景

  1. 防止意外繼承:工具類、DTO、實現細節類別,語義上無繼承必要
  2. 執行期優化:密封類別虛方法 JIT 可去虛擬化內聯,消除間接呼叫開銷
  3. 安全封鎖:敏感邏輯(授權、加密、授權碼驗證)防止竄改
  4. 單例模式:語義上單例不可有子類

實戰範例


abstract class AlgorithmBase {
    public abstract void Execute();
}

// 具體演算法實現:語義完整、無擴展需求、效能敏感
public sealed class AesEncryption : AlgorithmBase {
    public override void Execute() {
        // AES 核心實現... 密封確保演算法純粹性
    }
}

// 嘗試繼承 → 編譯錯誤
// class MyAes : AesEncryption {} // 錯誤:無法從密封類別衍生

效能實證


// 密封類別虛方法調用
sealed class SealedDemo {
    public virtual void Work() => Compute();
}

// 非密封類別
class NonSealedDemo {
    public virtual void Work() => Compute();
}

// Benchmark: SealedDemo.Work 經 JIT 內聯,NonSealedDemo.Work 保留虛呼叫
// 微基準測試顯示 10-20% 呼叫開銷差異(視內容而定)

設計哲學

預設密封,按需開放。 除非明確設計為可繼承(加 virtual/abstract、文檔化繼承契約),否則類別應預設 sealed。這符合「開閉原則」對擴展點的精準控制。

進階:密封類別與介面

密封類別可實現介面:


public sealed class JsonSerializer : ISerializer {
    public string Serialize(object obj) => JsonSerializer.Serialize(obj);
}

此模式常見於:實現介面契約、但不希望被繼承修改行為的工具類。

善用 sealed class,是架構師控制繼承邊界、榨乾效能、守護語義純粹性的關鍵手段。

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