System.Array類自動繼承泛型接口

首先看一下Array的定義:

並沒有實現泛型接口
實際Array是支持這些泛型接口的:

 

通過實例測試,Array又確實是實現了這些接口的。
同樣包括前面的老問題:
Array實現了:IList(包含Insert、Remove、RemoveAt)
Array沒實現:Insert、Remove、RemoveAt
在轉換爲接口後會拋出:System.NotSupportedException異常。

感謝rightyeah朋友的工作,我引用如下:
我查過,Array類實現了IList所有的方法,
可以用ildasm查看mscorlib.dll,Array實現了
System.Collections.IList接口的 Add,Clear,Contains,IndexOf,Insert ,Remove ,RemoveAt ,get_Item,set_Item方法

注意:是ildasm中查看到的結果,不是對象瀏覽器中的結果。

再看一下MSDN中的重要聲明:
http://msdn.microsoft.com/zh-cn/library/system.array.aspx

在 .NET Framework 2.0 版中,Array 類實現  System.Collections.Generic.IList <(Of <(T>)>)、 System.Collections.Generic.ICollection <(Of <(T>)>) 和  System.Collections.Generic.IEnumerable <(Of <(T>)>) 泛型接口。由於實現是在運行時提供給數組的,因而對於文檔生成工具不可見。因此,泛型接口不會出現在 Array 類的聲明語法中,也不會有關於只能通過將數組強制轉換爲泛型接口類型(顯式接口實現)纔可訪問的接口成員的參考主題。將某一數組強制轉換爲這三種接口之一 時需要注意的關鍵一點是,添加、插入或移除元素的成員會引發  NotSupportedException。

同時我們還意外發現:
.net還藏了不少的私貨
System.SZArrayHelper你用不了,
但MS可以,呵呵。


非泛型數且和泛型數組哪個更快點,
這個不想深入,只是引用一些網友現成的結果:

同一個數組泛型和非泛型時的Enumerator不同.
System.Array+SZArrayEnumerator
System.SZArrayHelper+SZGenericArrayEnumerator`1[System.Object]

用Reflector看他們的實現,大多數代碼一樣,唯一的區別是,
System.Array+SZArrayEnumerator.Current屬性的實現:
return this._array.GetValue(this._index);

而System.SZArrayHelper+SZGenericArrayEnumerator`1[System.Object].Current屬性的實現:
return this._array[this._index];

注意,前一個_array是Array類型的,後一個是object[]類型的.

也就是說,
[1]非泛型時,getvalue需要執行Array.GetValue()也就是下面這段額外的代碼:

[2]而泛型直接一個索引就返回值了.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章