标签:
刚开始接触的C#的时候,就一直被IEnumerable、IEnumerator、ICollection搞混,所以我就彻底的弄清楚他们的本质关系。
一讲到IEnumerable很自然的想到IEnumerator、foreach等。他们确实有很多密切的关系,今天我就详细的讲解一下这几方面的关系,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实例属性。
标签:
原文地址:http://www.cnblogs.com/lishuhua/p/4651172.html