转之:http://www.cnblogs.com/zhaopei/p/5769782.html

我们先思考几个问题:

  1. 为什么在foreach中不能修改item的值?
  2. 要实现foreach需要满足什么条件?

接下来,先开始我们的正文。

自己实现迭代器

.net中迭代器是通过IEnumerable和IEnumerator接口来实现的,今天我们也来依葫芦画瓢。

首先来看看这两个接口的定义:

先说IEnumerable,我们每天用的foreach你真的懂它吗?

先说IEnumerable,我们每天用的foreach你真的懂它吗?

并没有想象的那么复杂。其中IEnumerable只有一个返回IEnumerator的GetEnumerator方法。而IEnumerator中有两个方法加一个属性。

接下来开发画瓢,我们继承IEnumerable接口并实现:


先说IEnumerable,我们每天用的foreach你真的懂它吗?

下面使用原始的方式调用:

先说IEnumerable,我们每天用的foreach你真的懂它吗?

有朋友开始说了,我们平时都是通过foreache来取值的,没有这样使用过啊。好吧,我们来使用foreach循环:

先说IEnumerable,我们每天用的foreach你真的懂它吗?

为什么说基本上是等效的呢?我们先看打印结果,在看反编译代码。

先说IEnumerable,我们每天用的foreach你真的懂它吗?

由此可见,两者有这么个关系:

先说IEnumerable,我们每天用的foreach你真的懂它吗?

我们可以回答第一个问题了“为什么在foreach中不能修改item的值?”:

我们还记得IEnumerator的定义吗

先说IEnumerable,我们每天用的foreach你真的懂它吗?

接口的定义就只有get没有set。所以我们在foreach中不能修改item的值。

我们再来回答第二个问题:“要实现foreach需要满足什么条件?”:

必须实现IEnumerable接口?NO

先说IEnumerable,我们每天用的foreach你真的懂它吗?

我们自己写的MyIEnumerable删掉后面的IEnumerable接口一样可以foreach(不信?自己去测试)。

所以要可以foreach只需要对象定义了GetEnumerator无参方法,并且返回值是IEnumerator或其对应的泛型。细看下图:

先说IEnumerable,我们每天用的foreach你真的懂它吗?

也就是说,只要可以满足这三步调用即可。不一定要继承于IEnumerable。有意思吧!下次面试官问你的时候一定要争个死去活来啊,哈哈!




相关文章: