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

C# sealed 關鍵字完整指南:密封類別、密封成員與效能優化考量

     編輯:關於C語言

sealed 兩大用法

用法語法效果
密封類別sealed class MyClass禁止被繼承,不可與 abstract 共存
密封成員sealed override void Method()禁止後續衍生類別覆寫,必須搭配 override

經典範例:密封成員阻斷覆寫鏈


using System;

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"); // 密封 F
    public override void G() => Console.WriteLine("B.G");
}

class C : B {
    // 錯誤:無法覆寫 sealed 方法 F
    // public override void F() { }
    public override void G() => Console.WriteLine("C.G"); // 僅能覆寫 G
}

class Program {
    static void Main() {
        new A().F(); // A.F
        new A().G(); // A.G
        new B().F(); // B.F
        new B().G(); // B.G
        new C().F(); // B.F (繼承 B 的密封實作)
        new C().G(); // C.G
        Console.ReadKey();
    }
}

輸出結果


A.F
A.G
B.F
B.G
B.F
C.G

類別圖示意

A: F(virtual), G(virtual)
  ↓ 繼承
B: F(sealed override), G(override)
  ↓ 繼承
C: F(繼承 B 的 sealed), G(override)

設計動機與適用場景

  1. 安全性:核心驗證、加密、授權邏輯禁止被竄改
  2. 穩定性:第三方庫公開類別,避免使用者繼承破壞內部假設
  3. 效能微優化:JIT 可將 sealed 方法內聯、非虛擬呼叫(現代 Runtime 已大幅優化,實際增益微小)
  4. 語意明確:告訴維護者「此處不應被擴充」

常見誤區

  • 誤以為 sealed class 所有方法自動 sealed:只有繼承自基底的虛擬方法隱式 sealed;類別自行定義的新虛擬方法在 sealed class 中是非法的(編譯錯誤)
  • 混淆 sealed 與 private:private virtual 非法;密封針對繼承鏈,private 針對存取可見性
  • 過度使用:預設類別不密封,保持開放擴充性(OCP)

最佳實踐

  1. 類別預設 non-sealed,除非有強烈理由
  2. 方法預設 non-virtual,需要多型才 virtual,確定終點才 sealed
  3. 文檔說明密封原因:<remarks>Sealed because...</remarks>
  4. 結構體隱含 sealed(不可繼承)
  5. 靜態類別隱含 sealed

效能實測提示

微基準測試顯示 sealed 方法內聯優化在 .NET Core 3.1+ / .NET 5+ 已極難測量。選擇 sealed 應基於設計意圖,而非效能。

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