C#中的sealed修飾符的作用詳解
在 C# 中,sealed 修飾符的作用是 “密封” —— 用來(lái)阻止類(lèi)被繼承,或者阻止方法/屬性在派生類(lèi)中被重寫(xiě)。
? 1.sealed用于類(lèi)(class)
作用:
- 禁止其他類(lèi)繼承這個(gè)類(lèi)。
- 如果嘗試?yán)^承一個(gè)
sealed類(lèi),編譯器會(huì)報(bào)錯(cuò)。
示例:
public sealed class FinalClass
{
public void DoWork() { }
}
// ? 編譯錯(cuò)誤!不能繼承 sealed 類(lèi)
public class DerivedClass : FinalClass
{
}?? 常見(jiàn)用途:
- 設(shè)計(jì)上不希望被擴(kuò)展的類(lèi)(如工具類(lèi)、值對(duì)象)
- 提高性能(JIT 編譯器對(duì)
sealed類(lèi)有優(yōu)化)- .NET 中很多內(nèi)置類(lèi)型是
sealed的,比如string、DateTime
? 2.sealed用于方法或?qū)傩裕ū仨毰c override 一起用)
作用:
- 允許當(dāng)前類(lèi)繼承并重寫(xiě)父類(lèi)的虛成員(
virtual或abstract),
但禁止它的子類(lèi)再進(jìn)一步重寫(xiě)這個(gè)成員。
示例:
public class Base
{
public virtual void Say() => Console.WriteLine("Base");
}
public class Middle : Base
{
// 重寫(xiě) Say,并密封它
public sealed override void Say() => Console.WriteLine("Middle (sealed)");
}
public class Child : Middle
{
// ? 編譯錯(cuò)誤!Say() 已被 sealed,不能再重寫(xiě)
// public override void Say() { }
}?? 注意:
sealed修飾方法時(shí),必須同時(shí)使用override- 不能直接對(duì)非虛方法加
sealed
?? 為什么使用sealed?
| 場(chǎng)景 | 原因 |
|---|---|
| 防止濫用繼承 | 有些類(lèi)設(shè)計(jì)為“最終版本”,不希望被隨意擴(kuò)展 |
| 安全性 | 避免子類(lèi)破壞原有邏輯(尤其在庫(kù)開(kāi)發(fā)中) |
| 性能優(yōu)化 | JIT 編譯器可以對(duì) sealed 類(lèi)做內(nèi)聯(lián)等優(yōu)化 |
| 明確設(shè)計(jì)意圖 | 表達(dá)“這個(gè)類(lèi)到此為止”的語(yǔ)義 |
?? 常見(jiàn)誤區(qū)
? 錯(cuò)誤:以為 sealed 類(lèi)不能有虛方法
? 正解:sealed 類(lèi)可以有虛方法,但它自己不能被繼承,所以這些虛方法實(shí)際上也無(wú)法被重寫(xiě)(因?yàn)闆](méi)子類(lèi))。
? 錯(cuò)誤:sealed 方法可以單獨(dú)使用
? 正解:sealed 方法必須搭配 override,不能單獨(dú)修飾一個(gè)普通方法。
? 小結(jié)
| 用法 | 含義 |
|---|---|
sealed class MyClass | 該類(lèi)不能被繼承 |
sealed override void MyMethod() | 該方法在當(dāng)前類(lèi)是最終版本,子類(lèi)不能再重寫(xiě) |
?? 記住口訣:“sealed = 到此為止,不準(zhǔn)再改”
如果你正在設(shè)計(jì)一個(gè)工具類(lèi)(比如 MathHelper),并且確定不需要繼承,就可以把它聲明為 sealed:
public sealed class MathHelper
{
public static int Add(int a, int b) => a + b;
// 沒(méi)有實(shí)例成員,也不需要繼承 → 用 sealed 很合適
}問(wèn)題
如何防止類(lèi)被繼承?或者讓類(lèi)繼承但是防止其某些方法被重寫(xiě)?
使用sealed修飾符
到此這篇關(guān)于C#中的sealed修飾符的作用詳解的文章就介紹到這了,更多相關(guān)c# sealed修飾符內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#代碼實(shí)現(xiàn)將PDF轉(zhuǎn)換為PostScript(PS)格式
PostScript?是由?Adobe?Systems?在?20?世紀(jì)?80?年代開(kāi)發(fā)的一種頁(yè)面描述語(yǔ)言,本文將介紹如何使用?Spire.PDF?for?.NET?以編程方式將?PDF?文件轉(zhuǎn)換為?PostScript(PS)文件,有需要的小伙伴可以了解下2026-03-03
如何通過(guò)IL了解C#類(lèi)的構(gòu)造函數(shù)淺析
這篇文章主要給大家介紹了關(guān)于如何通過(guò)IL了解C#類(lèi)的構(gòu)造函數(shù)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-02-02
c#使用ManagedWifi查看當(dāng)前Wifi信號(hào)并選擇wifi的示例
這篇文章主要介紹了c#使用ManagedWifi查看當(dāng)前Wifi信號(hào)并選擇wifi的示例,需要的朋友可以參考下2014-04-04
C#獲取真實(shí)IP地址(IP轉(zhuǎn)為長(zhǎng)整形、判斷是否內(nèi)網(wǎng)IP的方法)
這篇文章主要介紹了C#獲取真實(shí)IP地址的實(shí)現(xiàn)代碼,包含把IP轉(zhuǎn)為長(zhǎng)整形、判斷是否是私網(wǎng)、內(nèi)網(wǎng)IP的方法,需要的朋友可以參考下2014-08-08
C# winform 請(qǐng)求http的實(shí)現(xiàn)(get,post)
本文主要介紹了C# winform 請(qǐng)求http的實(shí)現(xiàn)(get,post),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06
Unity實(shí)現(xiàn)UI光暈效果(發(fā)光效果)
這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)UI光暈效果,發(fā)光效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-01-01
WinForm實(shí)現(xiàn)多屏交互的實(shí)戰(zhàn)技巧和避坑指南
你是否遇到過(guò)這些問(wèn)題窗體顯示在錯(cuò)誤的屏幕、窗口位置被任務(wù)欄遮擋或者跨屏拖拽卡頓,本文將通過(guò) 3步核心流程、5大實(shí)戰(zhàn)技巧和10個(gè)高頻避坑指南,教你徹底掌握WinForm多屏交互開(kāi)發(fā),讓窗體精準(zhǔn)飛向副屏,需要的朋友可以參考下2025-09-09

