首先看一下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]而泛型直接一個索引就返回值了.