【源碼探索】.NET中的List,為什么即有Count屬性又有Count()方法

優秀的程序員的標準之一是:編寫更易于擴展的代碼

c27c7b4293190837535501837f2fdf44.jpeg

@圖片:奧森公園的向日葵 拍攝于2022年7月23日

01

問題緣起

上一篇中,我們知道List<T>的是基于數組實現的可變長度的列表。

很多小伙伴發現,List<T>即有Count屬性又有Count()方法,并且有人做過性能測試,Count屬性比Count()方法更快,因此得出結論,Count屬性是直接返回一個計算好的值,Count()方法需要遍歷列表計算長度。

事實是怎樣的?像微軟這樣全球頂級的開發團隊,是否會在基礎類庫中提供兩個一樣的功能,我們來探究一下。

02


源碼探究

Count屬性是List<T>提供的只讀屬性,直接返回私有變量_size記錄的元素數量。0b6a9132bad06dc8034f33232f6e796f.png

Count()方法是System.Linq.Enumerable中提供的擴展方法,List<T>實現接口IList<T>,間接實現接口ICollection<T>,由源碼可知,通過List<T>對象調用Count()方法,返回的是List<T>對象的Count屬性,二者并沒有區別。

Count()方法存在的意義是什么呢?

3eedebf71886a13f795ebe87a32b7082.png

03


軟件設計原則

微軟設計原則,參數設計原則中有一條:

請使用提供成員所需功能的最低派生參數類型。?

例如,假設你想要設計這樣一種方法,它可枚舉集合并將每個項目輸出到控制臺。?此類方法應將 IEnumerable 用作參數,而不是使用 ArrayList 或 IList 等內容。

微軟文檔:https://learn.microsoft.com/zh-cn/dotnet/standard/design-guidelines/parameter-design

微軟設計原則建議,在滿足所需功能的情況下,應使用IEnumerable,而不是使用ArrayList或IList,這也叫說明了Count()方法存在的意義,因為在IEnumerable中沒有Count屬性,只能通過Count()方法間接獲取元素數量。

這里體現了面向對象開發原則(SOLID),使用最低派生類型,職責單一,其子類型(實現類)易于替換,代碼可擴展性更好,符合開放封閉原則。

如何看待Count()方法比Count屬性慢?

04


正確認識性能問題

客觀的看待性能問題,應當從相對性能絕對性能兩方面進行交叉對比,從而得出一個中肯的結論。

Count()方法比Count屬性,大概慢10ns(不同設備環境會有差異),也就是百萬分之十毫秒,一億分之一秒,絕對性能差異微乎其微,而大部分性能測試為了體現兩者的性能差異,循環上百萬次,再對兩者進行對比,通過相對性能展示性能差異,殊不知,Count屬性本身耗時極低,相對性能差異被夸大

這一點一定要認識清楚,同樣的有文章分析在List<T>集合中Exists()比Any()性能好,也是相同的原理,切不可被片面的言論左右。

軟件開發過程就是一個決策取舍的過程,你是希望獲得更高的性能,還是更好的擴展性,相信每個小伙伴心中都有自己的答案。


喜歡的朋友可以點贊,轉發,加關注

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

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

相關文章

使用ASP.NET廣告控件的XML語言創建廣告鏈接--ASP.NET

1、AdRotator廣告控件的所有屬性都是可選的&#xff0c;XML文件中可以包含如下表所示的屬性&#xff08;XML文件的廣告屬性&#xff09;。 屬性 說明 ImageUrl 要顯示的圖像的URL NavigateUrl 單擊AdRotator控件時要轉到的網頁URL AlternateText 圖像不可用時現實的問…

vim編輯和命令模式、實踐

2019獨角獸企業重金招聘Python工程師標準>>> 9月29日任務 5.5 進入編輯模式 5.6 vim命令模式 5.7 vim實踐 Vim編輯模式 進入編輯模式 操作 說明 i 在光標所在字符前插入內容 I 在光標所在行行首插入內容 a 在光標所在字符后插入內容 A 在光標所在行行尾插入…

英語自動提取高頻詞_斑馬英語提分營免費體驗課

斑馬英語電腦版是一款專業可靠的英語學習軟件&#xff0c;斑馬英語官方版可以幫助孩子學習純正的英語口語發音&#xff0c;以講故事的形式讓孩子學習單詞及口語練習&#xff0c;斑馬英語電腦版針對兒童語言特征設計的智能口語測評系統&#xff0c;能夠自動識別發音和評分&#…

【C# Personal Handbook】開篇

博客已提更一年多了&#xff0c;這段時間里&#xff0c;發生了很多事情&#xff0c;也讓我對C#更加依戀&#xff0c;所以我決定重新更新博客&#xff0c;以自己的實踐經驗梳理C#的技術脈絡&#xff0c;也歡迎大家手下留情&#xff0c;耐心指點&#xff0c;讓我們共同進步吧&…

canvas特效代碼詳解(2)

canvas是一個就基于像素的畫圖h5元素。 利用canvas做一個如下描述所示的動態圖形&#xff1a;當鼠標點下去時開始繪圖&#xff0c;在鼠標結束時完成一個矩形&#xff0c;當再一次點擊時重復第一次的繪圖步驟。 1 <!DOCTYPE html>2 <html>3 <head>4 …

阿里云三維可視化使用初體驗

title: 阿里云三維可視化使用初體驗tags: 物聯網開發BIMcategories:物聯網本文主要的目標是使用阿里云的云產品 - 物聯網套件三維可視化 開始 準備工作 進入下載頁面下載頁面&#xff0c;點擊“模型編輯器下載”安裝模型編輯器下載安裝完畢&#xff0c;啟動模型編輯器下載&…

同時綁定onpropertychange 和 oninput 事件,實時檢測 input、textarea輸入改變事件,支持低版本IE,支持復制粘貼...

實時檢測 input、textarea輸入改變事件&#xff0c;支持低版本IE&#xff0c;支持復制粘貼 檢測input、textarea輸入改變事件有以下幾種&#xff1a; 1、onkeyup/onkeydown 捕獲用戶鍵盤輸入事件。缺陷&#xff1a;復制粘貼時無法檢測2、onchenge缺陷&#xff1a;要滿足觸發條件…

hp laser103 屬性沒有配置項_(常見解決方法)UEditor報錯“后端配置項沒有正常加載,上傳插件不能正常使用”...

&#xff08;常見解決方法&#xff09;UEditor報錯“后端配置項沒有正常加載&#xff0c;上傳插件不能正常使用”_向來蕭瑟也無畏-CSDN博客?blog.csdn.net報錯信息詳見此文的“排錯過程&&錯誤信息”→ueditor無法上傳圖片_向來蕭瑟也無畏-CSDN博客3種解決方法1.大小寫…

WinForm(十二)畫圖

在.NET中&#xff0c;畫圖主要是通過Graphics類實現的&#xff0c;這個類主要通過兩類方法完成畫圖&#xff0c;一類是DrawXXX&#xff0c;畫各種線條圖形&#xff1b;另一類是FillXXX,用各種形狀&#xff0c;填充各種圖形。Graphics是畫板&#xff0c;Draw各個方法是各種盞筆&…

從4個方面簡單介紹SaaS

你了解什么是SaaS嗎&#xff1f;SaaS有什么優勢&#xff1f;選擇SaaS平臺要注意哪些要素&#xff1f;在這里&#xff0c;怡海軟件將針對這些問題進行簡單介紹&#xff1a; 什么是SaaS&#xff1f;SaaS是Software-as-a-Service&#xff08;軟件即服務&#xff09;的簡稱&#xf…

騰訊的一筆畫游戲--巧妙解法

根據這個圖形我們可以發現圖中的規律。 所有數據的和 所有邊長的和-最后一個形狀的一個邊-除最后一個邊之外所有邊的一半。 知道了這個規律后我們就很容易去實現代碼了&#xff1a; 這里的解決關鍵點為——“余弦定理”&#xff0c;因為角度我們可以用&#xff08;n-2&#xf…

Map value類型不同的寫法

Map value類型不同的寫法 Map<String, Object> accountMapnew HashMap<String, Object>(); int userId data.get("userId").getAsInt(); int accType data.get("accType").getAsInt();String name data.get("accType").getAsStr…

mysql中局部變量說法正確的是_mysql全局變量和局部變量

全局變量和局部變量在服務器啟動時&#xff0c;會將每個全局變量初始化為其默認值(可以通過命令行或選項文件中指定的選項更改這些默認值)。然后服務器還為每個連接的客戶端維護一組會話變量&#xff0c;客戶端的會話變量在連接時使用相應全局變量的當前值初始化。舉一個例子&a…

Web應用架構-Full-text Search Service

Elasticsearch轉載于:https://www.cnblogs.com/zhitianji/p/9728016.html

終于找到你!如何將前端console.log的日志保存成文件?

本篇文章來自一個需求&#xff0c;前端websocket會收到各種消息&#xff0c;但是調試的時候&#xff0c;我希望把websoekt推送過來的消息都保存到一個文件里&#xff0c;如果出問題的時候&#xff0c;我可以把這些消息的日志文件提交給后端開發區分析錯誤。但是在瀏覽器里&…

基于 .NET 6 開發的開源遠程終端工具

你好&#xff0c;這里是 Dotnet 工具箱&#xff0c;定期分享 Dotnet 有趣&#xff0c;有用的工具&#xff0c;不要忘記關注。今天介紹一個非常實用的工具 mRemoteNG&#xff0c;這是一個基于 .NET 6 開發的遠程終端軟件&#xff0c;開源免費&#xff0c;不用擔心版權和軟件費用…

mysql 行列轉換 動態_mysql 行列動態轉換的實現(列聯表,交叉表)

(1)動態&#xff0c;適用于列不確定情況create table table_name(id int primary key,col1 char(2),col2 char(2),col3 int);insert into table_name values(1 ,A1,B1,9),(2 ,A2,B1,7),(3 ,A3,B1,4),(4 ,A4,B1,2),(5 ,A1,B2,2),(6 ,A2,B2,9),(7 ,A3,B2,8),(8 ,A4,B2,5),(9 ,A1,…

第六次作業—例行報告

本周PSP 進度條 代碼累計折線圖 博文累計折線圖 本周餅狀圖 轉載于:https://www.cnblogs.com/zej87/p/7738895.html

Tomcat7/8開啟WebDAV的支持

WebDAV是一種超文本傳輸協議&#xff0c;Tomcat默認是支持WebDAV的&#xff0c;且默認為禁用狀態。 更多詳細信息&#xff0c;請參考&#xff1a; https://zh.wikipedia.org/wiki/WebDAV http://www.webdav.org/ 開啟步驟如下&#xff1a; 1、在Tomcat的webapps目錄下新建webda…

算法復雜度分析(下)

前一篇文章算法復雜度分析&#xff08;上&#xff09;講述了復雜度的大 O 表示法和幾個分析原則&#xff0c;這篇文章我們來講講另外幾種復雜度&#xff0c;最好情況時間復雜度&#xff08;best case time complexity&#xff09;、最壞情況時間復雜度&#xff08;worst case t…