🔒 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是一种安全、可靠的设计选择。它既能 提高代码稳定性,又能让 编译器优化执行性能。