码迷,mamicode.com
首页 > 编程语言 > 详细

深入理解 IEnumerable和IEnumerator

时间:2015-07-23 13:51:51      阅读:139      评论:0      收藏:0      [点我收藏+]

标签:

刚开始接触的C#的时候,就一直被IEnumerable、IEnumerator、ICollection搞混,所以我就彻底的弄清楚他们的本质关系。

一讲到IEnumerable很自然的想到IEnumeratorforeach等。他们确实有很多密切的关系,今天我就详细的讲解一下这几方面的关系,IEnumerable接口中只有一个抽象方法

GetEnumerator(),他返回一个可访问循环集合的IEnumerator对象。该对象才是真正的集合访问器。只要有了它,foreach才能进行循环遍历数组或集合因为只有IEnumerator

才能访问集合中的每一项,既然IEnumerator这么神奇,那我们看一看它里边定义了哪些内容,通过反编译一下  它里边只有定义一个Current属性,MoveNext和Reset两个方法,

技术分享

  通过foreach来进行循环遍历数组了。举个例子,如果你声明一个类Grad:

  

 public class Grad
 {
      Car[] carArray = new Car[4];  //在Garage中定义一个Car类型的数组carArray,其实carArray在这里的本质是一个数组字段

        //启动时填充一些Car对象
        public Gard()
        {
            //为数组字段赋值
            carArray[0] = new Car("Rusty", 30);
            carArray[1] = new Car("Clunker", 50);
            carArray[2] = new Car("Zippy", 30);
            carArray[3] = new Car("Fred", 45);
        }
 }

 然后你想用foreach循环,不好意思不能实现,因为该类没有GetEnumerator()方法,就没有IEnumerator对象,就不可能调用方法MoveNext(),调用不了MoveNext,就不可能循环的了

  这个方法是有隐藏在System.collections命名空间中的IEnumerable接口定义的。这时有人问了:那为什么list就可以啊! 因为list继承了IEnumerable接口所以list就可以用!,

 

综上所述,一个类型是否支持foreach遍历,必须满足下面条件:

方案1:让这个类实现IEnumerable接口

方案2:这个类有一个public的GetEnumerator的实例方法,并且返回类型中有public 的bool MoveNext()实例方法和public的Current实例属性。

 

深入理解 IEnumerable和IEnumerator

标签:

原文地址:http://www.cnblogs.com/lishuhua/p/4651172.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!