對於 飛林沙的《把Array說透》的擴充套件

2021-09-22 10:35:37 字數 2212 閱讀 9628

今天看到 飛林沙同學的兩個帖子

把array說透和把array說透序一這兩個帖子都是從很底層的原理以及來說array陣列,看了讓人很受啟發,所以我想寫一篇從fcl的角度來闡述陣列的文章,權當拋磚引玉,高手請飄走....

system.array

地球人都知道,所有的陣列都是隱式的派生於這個基類。在msdn裡可以發現system.array的原型是:

1 [serializableattribute]

2 [comvisibleattribute(true)]

3 public abstract class array : icloneable, 

4     ilist, icollection, ienumerable 5 

而幾乎所有array所具備的功能都是實現這幾個介面.下面說說這幾個介面之間的關係。

ienumerable

這個介面就是傳說中的祖宗,是ilist和icollection介面的父介面.這個介面只有乙個方法.getenumerator(),這也是.net fcl對實現迭代器模式的介面。在.net中,所有實現了ienumerable介面的類才能用foreach關鍵字進行遍歷.

ienumberator

實現ienumberator介面的類是ienumerable介面getenumerator()方法返回的型別,表示是集合中當前的元素,實現ienumberator介面需要實現兩個方法和乙個屬性

ienumberator內部有movenext()方法和reset()方法,從名字不難看出,前者的用處是返回集合中下乙個需要被遍歷的元素,而reset()方法讓當前的enumberator回到集合中的第乙個元素.

ienumberator還有current屬性,返回集合中enumberator中當前的元素.

下面通過msdn中的**來對這兩個介面進行說明:

msdn中對ieunmerable介面的**演示

icollection

這個介面直接繼承自ienumerable介面,這個介面是system.collections命名空間的基本介面,從這個介面開始就有一些陣列特性了. 實現icollection介面需要實現4個方法(包括從ienumerable繼承來的乙個方法),和乙個屬性

icollection所具有的3個方法是addat,additem,item這三個方法,addat和additem方法均是新增乙個元素到集合,addat可以選擇集合中的任何位置進行插入,而additem方法預設將元素插入隊尾。

icollection的屬性是表示當前集合大小的count屬性.

ilist

ilist又直接繼承與icollection介面和ienumerable介面,從ilist開始,集合開始擁有更強大的功能,可以簡單理解為ilist主要針對動態集合,而icollection主要針對靜態集合.ilist裡包含了操作集合比較完整的方法,比如新增元素的add方法,插入到指定元素的insert方法,清楚所有元素的clear方法,以及是否存在元素的contains方法.

array與ilist

雖然array實現了ilist介面,但array中並不支援ilist中的某些方法。比如contains這樣的方法。有人會好奇為什麼array實現了ilist介面還不能使用裡面的方法呢?因為c#中陣列是定長的,而ilist是動態的,所以fcl中通過顯式實現ilist中的某些方法是array不具有ilist中的某些方法。如果想在array中使用ilist的方法,那首先要將array轉換為ilist

ilist實現了icollection,而icollection實現了ienumerable,為什麼陣列還要實現上面3個介面呢,實現ilist不就好嗎

這個問題我在網上查的資料有兩點

1.提高**可讀性(這個我想是最重要一條)

2.方便型別轉換(其實這個也是提高**可讀性的一部分)

icloneable

這個介面自成一家,和其他array實現的介面毫不相干,這個介面是fcl實現設計模式中的原型模式(prototype),在這裡其實就是淺複製(shallow copy)功能.

ilist,ienumerable,ienumerator

這幾個介面都是.net 2.0引入的泛型介面,上面所說的介面中除了icloneable的其他介面都存在於system.collections命名空間中,而泛型介面存在於system.collections.generics命名空間中。泛型我想大家都不陌生了,這裡就不討論了,在這裡只想說有了泛型後,前面的介面可以基本不用了:-)

高手請拍磚................

2020北林 對於考研的一些總結

比以往多等了兩個多月的複試終於結束了,幸好足夠幸運,算是逆襲成功了,考研這件事,真的不要輕易放棄也不要提早放鬆。各個方面都去用心地準備,最後的結果一定不會差,因為自己親身經歷 準備了很多事情,這個過程已經能為你的簡歷添彩了。先提前做一些準備工作,已經有了目標的話是最好的,學習起來更有動力。擇校方面 ...

隨筆 關於飛機維修檢測 想到的

學習目的 飛機每日的正常執行保證了幾百條生命的安全,可能是最嚴謹的維修檢修專案,通過學習飛機維修管理,提公升軟體測試維護的能力。學到的 飛機地勤檢修所有都是按照手冊操作進行排查,檢查各類天線探頭有無缺損,減少漏檢,等人為的影響 每架飛機的檢查流程專案最多達百項,機頭,機翼到機尾,從貨艙,到駕駛艙,逐...

沙盒的介紹

l 應用程式包 上圖中的 layer 包含了所有的資源檔案和可執行檔案 ldocuments 儲存應用執行時生成的 需要持久化的資料 itunes 同步裝置時 會備份該目錄。例如,遊戲應用可將遊戲存檔儲存在該目錄l ltmp 儲存應用執行時所需的 臨時資料 使用完畢後再將相應的檔案從該目錄刪除。應用...