C#中的sealed修饰符的作用详解

2025-11-14 18:50

本文主要是介绍C#中的sealed修饰符的作用详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《C#中的sealed修饰符的作用详解》在C#中,sealed修饰符的作用是“密封”用来阻止类被继承,或者阻止方法/属性在派生类中被重写,接下来通过本文给大家介绍C#中的sealed修饰符的作用详解,...

C# 中,sealed 修饰符的作用是 “密封” www.chinasem.cn—— 用来阻止类被继承,或者阻止方法/属性在派生类中被重写

✅ 1.sealed用于类(class)

作用:

  • 禁止其他类继承这个类
  • 如果尝试继承一个 sealed 类,编译器会报错。

示例:

public sealed class FinalClass
{
    public void DoWork() { }
}
// ❌ 编译错误!不能继承 sealed 类
public class DerivedClass : FinalClass 
{
}

常见用途:

  • 设计上不希望被扩展的类(如工具类、值对象)
  • 提高性能(JIT 编译器对 sealed 类有优化
  • .NET 中很多内置类型是 sealed 的,比如 stringDateTime

✅ 2.sealed用于方法或属性(必须与 override 一起用)

China编程

作用:

  • 允许当前类继承并重写父类的虚成员(virtualabstract),
    但禁止它的子类再进一步重写这个成员

示例:

public class Base
{
    public virtual void Say() => Console.WriteLine("Base");
}
public class Middle : Base
{
    // 重写 Say,并密封它
    public sealed override void Sayandroid() => Console.WriteLine("Middle (sealed)");
}
public class Child : Middle
{
    // ❌ 编译错误!Say() 已被 sealed,不能再重写
    // public override void Say() { }
}

注意:

  • sealed 修饰方法时,必须同时使用 override
  • 不能直接对非虚方法加 sealed

为什么使用sealed?

场景原因
防止滥用继承有些类设计为“最终版本”,不希望被随意扩展
安全避免子类破坏原有逻辑(尤其在库开发中)
性能优化JIT 编译器可以对 sealed 类做内联等优化
明确设计意图表达“这个类到此为止”的语义

⚠️ 常见误区

错误:以为 sealed 类不能有虚方法
正解sealed可以有虚方法,但它自己不能被继承,所以这些虚方法实际上也无法被重写(因为没子类)。

错误sealed 方法可以单独使用
正解sealed 方法编程必须搭配 override,不能单独修饰一个普通方法。

✅ 小结

用法含义
sealed class MyClass该类不能被继承
sealed override void MyMethod()该方法在当前类是最终版本,子类不能再重写

记住口诀:“sealed = 到此为止,不准再改”

如果你正在设计一个工具类(比如 MathHelper),并且确定不需要继承,就可以把它声明为 sealed

public sealed class MathHelper
{
    public static int Add(int a, int b) => a + b;
    // 没有实例成员,也不需要继承 → 用 sealed 很合适
}

问题

如何防止类被继承?或者让类继承但是防止其某些方法被重写?

使用sealed修饰符

到此这篇关于C#中的sealed修饰符的作用详解的文章就介绍到这了,更多相关c# sealed修饰符内容请搜索编程China编程(www.chinasem.cn)以前的文章或继续浏览下面的相javascript关文章希望大家以后多多支持China编程(www.chinasem.cn)!

这篇关于C#中的sealed修饰符的作用详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1156178

相关文章

C#借助Spire.XLS for .NET实现在Excel中添加文档属性

《C#借助Spire.XLSfor.NET实现在Excel中添加文档属性》在日常的数据处理和项目管理中,Excel文档扮演着举足轻重的角色,本文将深入探讨如何在C#中借助强大的第三方库Spire.... 目录为什么需要程序化添加Excel文档属性使用Spire.XLS for .NET库实现文档属性管理Sp

C++ move 的作用详解及陷阱最佳实践

《C++move的作用详解及陷阱最佳实践》文章详细介绍了C++中的`std::move`函数的作用,包括为什么需要它、它的本质、典型使用场景、以及一些常见陷阱和最佳实践,感兴趣的朋友跟随小编一起看... 目录C++ move 的作用详解一、一句话总结二、为什么需要 move?C++98/03 的痛点⚡C++

MySQL中between and的基本用法、范围查询示例详解

《MySQL中betweenand的基本用法、范围查询示例详解》BETWEENAND操作符在MySQL中用于选择在两个值之间的数据,包括边界值,它支持数值和日期类型,示例展示了如何使用BETWEEN... 目录一、between and语法二、使用示例2.1、betwphpeen and数值查询2.2、be

python中的flask_sqlalchemy的使用及示例详解

《python中的flask_sqlalchemy的使用及示例详解》文章主要介绍了在使用SQLAlchemy创建模型实例时,通过元类动态创建实例的方式,并说明了如何在实例化时执行__init__方法,... 目录@orm.reconstructorSQLAlchemy的回滚关联其他模型数据库基本操作将数据添

Java中ArrayList与顺序表示例详解

《Java中ArrayList与顺序表示例详解》顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构,:本文主要介绍Java中ArrayList与... 目录前言一、Java集合框架核心接口与分类ArrayList二、顺序表数据结构中的顺序表三、常用代码手动

JAVA线程的周期及调度机制详解

《JAVA线程的周期及调度机制详解》Java线程的生命周期包括NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING和TERMINATED,线程调度依赖操作系统,采用抢占... 目录Java线程的生命周期线程状态转换示例代码JAVA线程调度机制优先级设置示例注意事项JAVA线程

详解C++ 存储二进制数据容器的几种方法

《详解C++存储二进制数据容器的几种方法》本文主要介绍了详解C++存储二进制数据容器,包括std::vector、std::array、std::string、std::bitset和std::ve... 目录1.std::vector<uint8_t>(最常用)特点:适用场景:示例:2.std::arra

C++构造函数中explicit详解

《C++构造函数中explicit详解》explicit关键字用于修饰单参数构造函数或可以看作单参数的构造函数,阻止编译器进行隐式类型转换或拷贝初始化,本文就来介绍explicit的使用,感兴趣的可以... 目录1. 什么是explicit2. 隐式转换的问题3.explicit的使用示例基本用法多参数构造

Android使用java实现网络连通性检查详解

《Android使用java实现网络连通性检查详解》这篇文章主要为大家详细介绍了Android使用java实现网络连通性检查的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录NetCheck.Java(可直接拷贝)使用示例(Activity/Fragment 内)权限要求

C++,C#,Rust,Go,Java,Python,JavaScript的性能对比全面讲解

《C++,C#,Rust,Go,Java,Python,JavaScript的性能对比全面讲解》:本文主要介绍C++,C#,Rust,Go,Java,Python,JavaScript性能对比全面... 目录编程语言性能对比、核心优势与最佳使用场景性能对比表格C++C#RustGoJavapythonjav