sealed类不能被继承,是编译期强制约束,任何继承都会报cs0239;abstract与sealed语义冲突,编译器禁止同时使用而报cs0413;结构体隐式sealed,不可显式添加sealed修饰符。

sealed 类不能被继承,这是编译期强制约束,不是运行时检查;一旦加了 sealed,任何 class Derived : SealedClass 都会直接报错 CS0239。
为什么 sealed class 不能同时用 abstract?
因为语义冲突:abstract 要求必须被继承并实现抽象成员,而 sealed 明确禁止继承。C# 编译器会直接拒绝这种组合,报错 CS0413。
-
abstract sealed class Bad→ 编译失败 - 结构体(
struct)天生隐式 sealed,所以也不能加sealed修饰符,否则报 CS0723 - 如果想限制“只能实例化、不可定制”,sealed class 是比 abstract + private ctor 更清晰的选择
sealed override 方法的典型误用场景
你只能对已标记 virtual 或 abstract 的成员,在重写时加 sealed override;单独写 sealed void Foo() 是非法语法,编译器报 CS0549。
- 正确写法:
public sealed override void Draw() { ... } - 错误写法:
public sealed void Draw() { ... }(缺少override) - 常见坑:在基类没声明
virtual的方法上强行加sealed override,会报 CS0506 - 密封方法只影响「下一层」派生类:Z 继承 Y,Y 密封了 X 的虚方法 F,则 Z 不能重写 F,但 Y 自身仍可调用 base.F()
密封类在 Dispose 模式中的特殊处理
密封类若实现 IDisposable,通常应把带布尔参数的受保护 Dispose(bool) 方法设为 private,而非 protected —— 因为派生类根本不存在,留着 protected 只会让调用者误以为可重写。
- 非密封类:需要
protected virtual void Dispose(bool),供子类扩展释放逻辑 - 密封类:直接
private void Dispose(bool)+ 公开public void Dispose()即可 - 忽略这点会导致 API 表面开放、实际无法使用,还可能误导团队后续误加继承
最容易被忽略的是性能暗示:JIT 对 sealed class 的虚方法调用可能做去虚拟化(devirtualization),但这个优化不保证发生,也不该作为使用 sealed 的主要理由;核心判断始终是「这个类型的设计意图是否允许外部定制」。










