对于 飞林沙的<把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,如需转载请自行联系原作者
相关文章
|
JavaScript 前端开发 索引
扩展JavaScript数组(Array)添加删除元素方法
在JavaScript数组中,有很多不便之处,比如直接使用delete关键字删除数组中的一个元素是会产生空位的。文本为JavaScript数组(Array)扩展添加删除元素方法。
87 0
扩展JavaScript数组(Array)添加删除元素方法
|
索引
ES6中Array对象的方法和扩展、string的扩展方法、数组的遍历。(含例题)
学习ES6中Array对象的方法和扩展、string的扩展方法、数组的遍历。
195 0
|
Web App开发 前端开发 索引
|
JavaScript Java BI
|
前端开发 JavaScript .NET
[导入]ASP.NET AJAX 说明文档->客户端引用->全局命名空间->JavaScript 基础类型扩展->Array 类型扩展
Array 类型扩展。提供了基于ECMAScript (JavaScript) 的 Array 对象的扩展.将另一个 Array对象 的元素添加到 Array对象 的末尾。将元素插入 Array 的指定索引处。
706 0
|
JavaScript 前端开发 .NET
[导入]ASP.NET AJAX 说明文档->客户端引用->全局命名空间->JavaScript 基础类型扩展->Array 类型扩展->add 函数
Array.add 函数。将元素添加到 Array 的结尾处. 本函数是静态函数,使用时无需实例化。语法Array.add(array,文章来源:http://blog.csdn.net/chsword/archive/2007/02/24/1513250.aspx
1211 0
|
Web App开发 JavaScript 前端开发
[导入]ASP.NET AJAX 说明文档->客户端引用->全局命名空间->JavaScript 基础类型扩展->Array 类型扩展->addRange 函数
Array.addRange 函数。使用 addRange 函数将一个Array中的元素添加到另一个 Array 的结尾处.如果 items 为不包含任何元素的数组, 则目标数组无变化,且无异常抛出. 注意。
779 0
|
前端开发 JavaScript .NET
[导入]ASP.NET AJAX 说明文档->客户端引用->全局命名空间->JavaScript 基础类型扩展->Array 类型扩展->clear 函数
Array.clear 函数。使用 clear函数 从 Array对象 中移除所有元素。下面的示例展示了如何使用 clear 函数。文章来源:http://blog.csdn.net/chsword/archive/2007/02/24/1513298.aspx
509 0
|
JavaScript 前端开发 .NET
[导入]ASP.NET AJAX 说明文档->客户端引用->全局命名空间->JavaScript 基础类型扩展->Array 类型扩展->clone 函数
创建 Array 的浅表副本. 静态函数,使用无需实例化。文章来源:http://blog.csdn.net/chsword/archive/2007/02/24/1513307.aspx
774 0
|
Web App开发 JavaScript 前端开发
[导入]ASP.NET AJAX 说明文档->客户端引用->全局命名空间->JavaScript 基础类型扩展->Array 类型扩展->contains 函数
Array.contains 函数。使用 contains 函数确定某元素是否在 Array 中。在Firefox浏览器中 调用 contains 函数 如果数组中有元素被设置为 undefined且item 为 undefined 则返回 true .其它所有浏览器,在此情况下函数返回 false.以下示例展示了如何使用contains 函数来确定某元素是否在 Array 中。
615 0