Skip to Content
MUZINET-NOTE 4.0 is released 🎉
技术知识库C#密封类-sealed

🔒 C# 中的 sealed 关键字

在 C# 中,sealed(密封)关键字用于 防止类被继承,也可以用于 防止方法在派生类中被重写


🧩 一、什么是密封类(Sealed Class)

在类定义中使用 sealed 关键字,表示该类是一个 密封类(Sealed Class)
密封类无法被其他类继承,通常用于防止类被扩展或修改。

public sealed class ContactContext : DbContext { // Magic string. public static readonly string RowVersion = nameof(RowVersion); // Magic strings. public static readonly string ContactsDb = nameof(ContactsDb).ToLower(); // Inject options. public ContactContext(DbContextOptions<ContactContext> options) : base(options) => Debug.WriteLine($"{ContextId} context created."); // List of Contact. public DbSet<Contact>? Contacts { get; set; } // Define the model. protected override void OnModelCreating(ModelBuilder modelBuilder) { // 定义影子属性 RowVersion,用于并发控制 modelBuilder.Entity<Contact>() .Property<byte[]>(RowVersion) .IsRowVersion(); base.OnModelCreating(modelBuilder); } // Dispose pattern. public override void Dispose() { Debug.WriteLine($"{ContextId} context disposed."); base.Dispose(); } public override ValueTask DisposeAsync() { Debug.WriteLine($"{ContextId} context disposed async."); return base.DisposeAsync(); } }

⚙️ 二、密封类的特点

特点说明
🚫 不能被继承密封类不能作为基类,其他类无法从它派生。
🔒 提高安全性防止外部修改或重写逻辑,确保类行为稳定。
提升性能编译器可进行优化,因为它知道该类不会被继承。
🧱 适用于工具类、上下文类等封闭设计比如 EF Core 的 DbContext、配置类、服务类等。

🧠 三、密封方法(Sealed Method)

除了密封类,sealed 还可以用于 方法。 当方法来自基类的虚方法(virtual),你可以在派生类中使用 sealed override 来阻止进一步重写。

public class BaseClass { public virtual void DoWork() => Console.WriteLine("Base work"); } public class DerivedClass : BaseClass { public sealed override void DoWork() => Console.WriteLine("Derived sealed work"); } // ❌ 以下类会报错,因为 DoWork 已被密封 public class AnotherClass : DerivedClass { // Error: cannot override sealed member public override void DoWork() { } }

🧱 四、使用场景推荐

场景说明
🔐 防止继承的安全场景比如数据库上下文、系统配置类等。
⚙️ API 设计稳定性不希望被子类破坏接口逻辑。
🚀 性能优化场景高频实例化类、工具类可声明为 sealed。

🧩 五、与其他修饰符的对比

修饰符可否被继承可否被实例化用途
class✅ 可以✅ 可以普通类
abstract❌ 不可实例化✅ 可被继承抽象类,提供模板行为
sealed❌ 不可被继承✅ 可实例化密封类,防止扩展

✅ 六、总结

  • sealed 关键字用于防止继承。
  • 可提高类的安全性与执行性能。
  • 常用于上下文类(如 EF Core DbContext)或工具类。
  • 可与 override 结合用于方法层面的“密封重写”。

💬 小结:

当一个类的行为已经十分明确且不希望被扩展时,使用 sealed 是一种安全、可靠的设计选择。

它既能 提高代码稳定性,又能让 编译器优化执行性能