C# Sealed

2025 年 9 月 8 日 | 阅读 6 分钟

C# 的 sealed 关键字用于对类和方法施加限制。如果我们创建一个 sealed 类,它就不能被继承。如果我们创建一个 sealed 方法,它就不能被重写。它通常用于防止类被不希望地扩展,并确保某些方法在派生类中不被修改。

注意:结构体(Structs)是隐式 sealed 的,因此不能继承它们。

C# Sealed 类

在 C# 编程语言中,sealed 类是一个不能被任何其他类继承的类。当我们使用 sealed 关键字创建 sealed 类时,我们可以有效地锁定该类,没有人可以从它继承新类。

当知道没有其他类会需要更改 sealed 类的行为,或者当我们需要通过消除运行时检查继承的开销来优化性能时,sealed 类很有用。

语法

它具有以下语法:

在这个语法中,

  • ClassName: 表示类的名称。

未使用 sealed 类的 C# Sealed 类示例

让我们举例说明 C# 中未使用 sealed 关键字的 sealed 类。

示例

编译并运行

输出

Compile Time Error: 'Dog': cannot derive from sealed type 'Animal'

说明

在此示例中,我们将尝试声明一个具有 eat 方法的 sealed 类 Animal,但由于 sealed 类不能被继承,Dog: Animal 将导致编译器错误。如果未使用 sealed 关键字,它将允许 Dog 继承 eat() 以及它的 bark() 方法,由 Main 调用。

使用 Sealed 类的 C# Sealed 示例

让我们举例说明 C# 中的 sealed 类。

示例

编译并运行

输出

Car started with a key.

说明

在此示例中,我们声明了一个基类 Vehicle,其中包含一个虚拟的 Start 方法,以及一个 sealed 类 Car,它重写了这个虚拟方法。在 Main 中,Car 对象调用其 Start 方法,输出“Car started with a key.”。由于 Car 是 sealed 的,因此没有类可以继承它。

何时使用 Sealed 类?

我们可以在不同的上下文中使用 sealed 类。其中一些如下:

  • 用于避免不希望的继承。
  • 用于保护敏感行为免被重写。
  • 在某些情况下用于最大化性能。

C# Sealed 方法

在 C# 编程语言中,sealed 方法不能在派生类中被重写。它与 override 关键字一起使用。只有当一个方法重写了一个基类方法时,它才能被 sealed。除非一个方法被重写,否则不能对其应用 sealed 关键字。

语法

它具有以下语法:

C# 中的 sealed 方法不能进一步被重写。它必须与方法中的 override 关键字一起使用。

使用 sealed 关键字和方法来阻止重写的 C# Sealed 示例

让我们看一个例子来说明 C# 中的 sealed 方法。

示例

编译并运行

输出

Compile Time Error: 'BabyDog.run()': cannot override inherited member 'Dog.run()' because it is sealed

说明

此示例将无法编译,因为 Dog 已将 run() 方法 sealed,BabyDog 不能重写它。如果 BabyDog 中的 run() 重写被取消注释,它将继承 Dog 的 run() 方法并输出“eating biscuits...”后跟“running very fast...”

注意:局部变量不能是 sealed 的。

在 C# 中对局部变量使用 sealed 的无效示例

让我们举例说明在 C# 中对局部变量使用 sealed 的无效用法。

示例

编译并运行

输出

Compile Time Error: Invalid expression term 'sealed'

说明

此示例将无法编译,因为 C# 不支持将 sealed 关键字与 int x 等局部变量一起使用。sealed 仅适用于类或方法重写,而不适用于原始变量。

C# Sealed 示例:密封重写的方法以限制进一步重写

让我们举例说明如何在 C# 中密封重写的方法以限制进一步重写。

示例

编译并运行

输出

Manager is managing the team
Project Manager is planning tasks

说明

在此示例中,我们定义了一个具有虚拟 Work 方法的 Employee 类,并在一个 sealed 的 Manager 类中重写它以防止进一步修改,并在 ProjectManager 类中引入了一个 Plan 方法。在 Main() 函数中,ProjectManager 实例调用 Work(来自 Manager)和 Plan。

C# Sealed 的特性

C# Sealed 有几个特性。其中一些如下:

  • Sealed 类不能被继承。
  • Sealed 方法不能被重写,但可以声明在可继承的类中。
  • 在 C# 中,所有类除非被标记为 sealed,否则都是可继承的。
  • 结构体是隐式 sealed 的,因此我们不能继承它们。
  • Sealed 有助于提高性能,因为 sealed 方法由于编译器优化而运行速度更快。

结论

总之,C# sealed 用于通过不允许其他类继承 sealed 类或防止 sealed 方法被进一步重写来限制继承。它有助于维护类的设计的完整性,防止其实现被修改。它还可以提供性能优势,因为运行时知道该类型不能被扩展。

sealed 类是 final 的,不能是抽象的,而 sealed 方法是在派生类中重写但不能在后续子类中再次重写的方法。

C# Sealed 常见问题解答

1)C# 中的 sealed 关键字是什么?

在 C# 编程语言中,sealed 关键字用于防止类被继承或方法被重写。它可以用于类、方法和属性。

2)在 C# 中可以实例化一个 sealed 类吗?

在 C# 中,sealed 类可以像普通类一样被实例化;但是,它们不能作为其他类的基类。

3)sealed 类的成员可以被重写吗?

如果一个方法在基类中被声明为 virtual,派生类可以正常重写它。如果派生类 sealing 了该方法,则后续的子类就不能重写它。

4)在 C# 中是否可以 sealing 一个方法?

是的,方法可以被 sealing,但前提是它是对虚拟方法的重写。sealing 一个重写的方法可以阻止在派生类中进一步重写。

5)sealed 与 C# 中的 static 相关吗?

不,静态类和 sealed 类是不同的。静态类是自动 sealed 的,但 sealed 类不必是静态的。