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]而泛型直接一个索引就返回值了.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值