天天看點

對于 飛林沙的<把Array說透>的擴充

 今天看到 飛林沙同學的兩個文章

     把Array說透和把Array說透序一這兩個文章都是從很底層的原理以及來說Array數組,看了讓人很受啟發,是以我想寫一篇從FCL的角度來闡述數組的文章,權當抛磚引玉,高手請飄走....

     System.Array

         地球人都知道,所有的數組都是隐式的派生于這個基類。在MSDN裡可以發現System.Array的原型是:

1 [SerializableAttribute]

2 [ComVisibleAttribute(true)]

3 public abstract class Array : ICloneable, 

4     IList, ICollection, IEnumerable

      而幾乎所有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<T>,IEnumerable<T>,IEnumerator<T>

            這幾個接口都是.net 2.0引入的泛型接口,上面所說的接口中除了ICloneable的其他接口都存在于System.Collections命名空間中,而泛型接口存在于System.Collections.Generics命名空間中。泛型我想大家都不陌生了,這裡就不讨論了,在這裡隻想說有了泛型後,前面的接口可以基本不用了:-)

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

本文轉自CareySon部落格園部落格,原文連結:http://www.cnblogs.com/CareySon/archive/2009/10/14/1582908.html,如需轉載請自行聯系原作者

繼續閱讀