為什么應該默認將 Class 設為密封類?

前言

最近在 dotnet/sdk 上看到一個 Issue,它提出了一個有趣的要求:默認情況下將類設置為密封類(Sealed)

b796bb02d33474926cbb6657980bf250.png

什么是密封類?

默認情況下,類是開放的,這意味著它是可以被繼承的。例如:

class?BaseClass
{public?virtual?string?Method(){return?"BaseClass.Method";}
}class?DerivedClass?:?BaseClass
{public?override?string?Method(){return?"DerivedClass.Method";}
}class?AnotherClass?:?DerivedClass
{//...
}

而密封類是一種特殊的類,它使用sealed修飾符阻止其他類繼承自該類。例如:

sealed?class?SealedClass?:?BaseClass
{public?override?string?Method(){return?"SealedClass.Method";}
}

cf5d11fe3a373a7e2bae800ccaa3b001.png

那為什么要將類默認設為密封類呢?答案是——性能

Benchmark

首先創建一個控制臺程序,并添加 BenchmarkDotNet 包。

然后創建一個性能測試類:

public?class?PerformanceBenchmark
{private?readonly?DerivedClass?derivedClass?=?new?DerivedClass();private?readonly?SealedClass?sealedClass?=?new?SealedClass();[Benchmark]public?void?DerivedClass_Method()?=>?derivedClass.Method();[Benchmark]public?void?SealedClass_Method()?=>?sealedClass.Method();?
}

并且修改Program.cs文件,添加如下代碼:

static?void?Main(string[]?args)
{var?summary?=?BenchmarkRunner.Run<PerformanceBenchmark>();
}

最后,運行程序,查看結果:

dotnet?run?-c?Release

1b3b0334f79bbbd6a4b4ca9c0059953a.png

可以看到,SealedClass_Method方法執行得明顯快很多。

原理

為什么密封類比普通類執行得快呢?讓我們看看 JIT 生成的代碼:

ded35ad07d8b6e1248d8d4d3543a4f9d.png

可以看到,當調用密封類中的重寫方法時,是直接在密封類對象的內存地址上完成的。而當調用普通類中的重寫方法時,卻需要額外的mov指令,這是因為普通類的內存地址是不確定的,需要先獲取到對象的類型,然后再從對應類型中獲取方法。

總結

在本文中,我們了解了密封類有更好的性能。也就是說,如果你的類不會被繼承,那么請將它設置為密封類。

添加微信號【MyIO666】,邀你加入技術交流群

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/281806.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/281806.shtml
英文地址,請注明出處:http://en.pswp.cn/news/281806.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Spring工具類的使用

2019獨角獸企業重金招聘Python工程師標準>>> Spring-core中提供了大量的工具類&#xff0c;常用的有StringUtils、ObjectUtils、NumberUtils、Base64Utils等&#xff0c;Spring工具類在spring-core.jar中的org.springframework.util包下。 org.springframework.util…

python作業高級FTP(第八周)

作業需求&#xff1a; 1. 用戶加密認證 2. 多用戶同時登陸 3. 每個用戶有自己的家目錄且只能訪問自己的家目錄 4. 對用戶進行磁盤配額、不同用戶配額可不同 5. 用戶可以登陸server后&#xff0c;可切換目錄 6. 查看當前目錄下文件 7. 上傳下載文件&#xff0c;保證文件一致性 8…

java用log.i打印數組_java-使用JSCH將ssh日志打印到列表(android)

我一直試圖通過將包含我目錄名稱的log.i字符串值添加到數組中,然后使用數組適配器通過listView打印它們,來在listView中的目錄中打印項目.但是,當我嘗試運行該應用程序時,它將打印包含目錄名稱的日志,但不會在listView上打印任何內容.有什么幫助嗎&#xff1f;這是我的代碼&…

Edge 瀏覽器被爆存在 XSS 繞過漏洞

來自知名安全測試套件Burp Suite廠商PortSwigger的安全專家Gareth Heyes近日在微軟Edge瀏覽器的內置XSS過濾器存在繞過漏洞&#xff0c;這就意味著盡管微軟在Edge瀏覽器中進行了大量的安全策略部署&#xff0c;但用戶瀏覽網頁的時候依然有可能讓攻擊者通過這種方式在Edge瀏覽器…

來了!十大更新

面向 Windows 10 正式版用戶&#xff0c;微軟發布了 2022 年 10 月更新。Windows 10 版本 21H1 更新后操作系統內部版本升級至 Build 190432130/2132&#xff08;帶外更新&#xff09;。Windows 10 版本 21H2 更新后操作系統內部版本升級至 Build 19044.2130/2132&#xff08;帶…

使用ansible 批量分發SSH Key

先確保你電腦有ansible&#xff0c;我是mac的用brew安裝,其他可用yum安裝brew search ansiblebrew install ansible我已經安裝好2.7了生成下自己的key&#xff0c;一路回車ssh-keygen -t rsa編輯host&#xff0c;添加需要增加ssh key的機器vi /etc/ansible/hosts【hostgroup】我…

使用Git簡單筆記

這里只是作為簡單的筆記整理&#xff0c;第一次使用的推薦先看一下廖大的教程&#xff0c;內容很多很細&#xff0c;可以邊看邊練、看不懂的地方先記著、爭取七七八八看下來。 心情不佳的分割線 廖雪峰的git教程&#xff1a; https://www.liaoxuefeng.com/wiki/001373951630592…

java中的path類_詳談java中File類getPath()、getAbsolutePath()、getCanonical的區別

簡單看一下描述&#xff0c;例子最重要。1、getPath()&#xff1a;返回定義時的路徑&#xff0c;(就是你寫什么路徑&#xff0c;他就返回什么路徑)2、getAbsolutePath()&#xff1a;返回絕對路徑&#xff0c;但不會處理“.”和“..”的情況3、getCanonicalPath()&#xff1a;返…

部署站點支持Https訪問的方法

1、申請公鑰和私鑰&#xff0c;放到服務器 2、編輯default配置文件 改為 加上證書路徑 ps:泛域名支持admin.xxx.com、demo.xxx.com等等&#xff0c;而免費的Lets Encrypt僅支持www.xxx.com和xxx.com 整理自www.laravist.com轉載于:https://www.cnblogs.com/lamp01/p/6952464.ht…

.NET Core Onvif協議C#教程系列之XiaoFeng.Onvif組件庫

物聯網IOT大背景下音視頻領域的Onvif 協議在2008年成為全球性的開放接口標準。于是一批開發者涌入該技術領域使用各種編程語言對其改造升級封裝。因為是國際標準&#xff0c;所以規范內容比較多&#xff0c;物聯網領域涉及又廣&#xff0c;所以研究協議是一個很耗時間的一項工作…

php異常處理的深入

引出 如果你調一個類&#xff0c;調用時數據驗證時報了個錯&#xff0c;你會以什么方式返回 數組&#xff0c;布爾值&#xff1f; 數組這個可以帶錯誤原因回來&#xff0c;那布爾值呢&#xff1f; 返回了個 false, 報錯時把錯誤放在類變量里&#xff1f;還是專門用一個獲取錯誤…

C# 跨平臺的支付類庫ICanPay

隨著微軟的開源&#xff0c;越來越多的項目支持跨平臺&#xff0c;但是各種支付平臺提供的類庫&#xff0c;又老又不支持跨平臺&#xff0c;吐槽下&#xff0c;尤其是微信&#xff0c;還有好多坑&#xff0c;于是ICanPay誕生了&#xff0c;今天就來講ICanPay是什么&#xff0c;…

.NET CORE 下收發郵件之 MAILKIT

背景利用代碼發送郵件在工作中還是比較常見的&#xff0c;相信大家都用過SmtpClient來處理發送郵件的操作&#xff0c;不過這個類以及被標記已過時&#xff0c;所以介紹一個微軟推薦的庫MailKit來處理。MailKit開源地址&#xff1a;https://github.com/jstedfast/MailKit需要郵…

【20181026T2】**圖【最小瓶頸路+非旋Treap+啟發式合并】

題面 【錯解】 最大最小&#xff1f;最小生成樹嘛 蛤&#xff1f;還要求和&#xff1f; 點分治&#xff1f; 不可做啊 寫了個MST暴力LCA&#xff0c;30pts&#xff0c;140多行 事后發現30分是給dijkstra的 woc 【正解】 樹上計數問題&#xff1a;①并查集②啟發式合并③點分治 …

java實現關鍵詞云_Java synchronized 關鍵詞詳細說明

Java synchronized 關鍵詞詳細說明外置專業技能點系統進程和進程的定義進程建立方法進程的情況情況變換線程安全的定義synchronized 關鍵詞的幾類使用方法裝飾非靜態數據組員方式synchronized public void sync(){}裝飾靜態數據組員方式synchronized public static void sync()…

損失函數(Loss function) 和 代價函數(Cost function)

1損失函數和代價函數的區別&#xff1a; 損失函數(Loss function)&#xff1a;指單個訓練樣本進行預測的結果與實際結果的誤差。 代價函數(Cost function)&#xff1a;整個訓練集&#xff0c;所有樣本誤差總和(所有損失函數總和)的平均值。&#xff08;這一步體現在propagate()…

Hadoop/HDFS命令

Hadoop中文手冊&#xff1a;http://hadoop.apache.org/docs/r1.0.4/cn/commands_manual.html 英文手冊&#xff1a;http://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-common/CommandsManual.html Hadoop fs命令 hadoop fs: 該命令可以用于其他文件系統&#x…

《Node.js 入門系列》—— 一些簡單的排錯方法(一)

目錄 TypeError: undefined is not a functionTypeError: Cannot read property xxx of undefined 或者 TypeError: Cannot read property xxx of null檢查變量是未賦值檢查函數是否有返回值檢查變量是否引用了某個對象不存在的屬性檢查調用函數時是否未該傳遞參數俗話說“常在…

內置IOC容器ServiceCollection

.NetCore內置IOC容器ServiceCollection一、IOC介紹IOC&#xff1a;全名(Inversion of Control)-控制反轉IOC意味著我們將對象的創建控制權交給了外部容器&#xff0c;我們不管它是如何創建的&#xff0c;我們只需要知道&#xff0c;當我們想要某個實例時&#xff0c;我們可以直…

java中 有沒有方法將瀏覽器標簽欄去掉_用JS去掉IE窗口的標題欄,工具欄,地址欄...

前言:經常上網的朋友可能會到過這樣一些網站&#xff0c;一進入首頁立刻會彈出一個窗口&#xff0c;或者按一個連接或按鈕彈出&#xff0c;通常在這個窗口里會顯示一些注意事項、版權信息 、警告、歡迎光顧之類的話或者作者想要特別提示的信息。其實制作這樣的頁面效果非常的容…