本帖最后由 陈辉 于 2012-11-19 09:10 编辑
1、源代码
static void Main(string[] args)
{
List<string> list = new List<string> { "Lucy", "Jim", "Tom" };
//-----------------------foreach实现的---------------------------------------
//foreach (string s1 in list)
//{
// Console.WriteLine(s1);
//}
//-----------------------foreach的内部实现机制--------------------------------
IEnumerator<string> enumerator = list.GetEnumerator();
while (enumerator.MoveNext())
{
string s1 = enumerator.Current;
Console.WriteLine(s1);
}
Console.ReadKey();
}
2、对foreach的内部实现机制的代码的解释:
a、List泛型类的GetEnumerator方法是在IEnumerable<T>接口定义的,因此List泛型类要实现IEnumerable<T>接口
b、 List泛型类的GetEnumerator方法 返回的是List<T>.Enumerator,而List<T>.Enumerator是在List泛型类 内部定义的一个结构,它实现了IEnumerator<T>接口,因此,要想用foreach,那么自定
义的类必须实现 IEnumerable或IEnumerable<T> 和IEnumerator 或 IEnumerator<T>
c、再调用 IEnumerator<T>接口 中的MoveNext方法,当调用一次MoveNext方法时,就遍历集合中的一个元素,并将当前遍历的元素保存到IEnumerator<T>接口 的Current属性中
MoveNext方法的内部实现(可以用.net reflector查看List泛型类 实现的MoveNext方法):
public bool MoveNext()
{
List<T> list = this.list; //获得List泛型集合
if ((this.version == list._version) && (this.index < list._size))
{
// list._items[this.index] ->获得当前遍历的元素
//并单签遍历的元素保存到IEnumerator<T>接口 的Current属性中
this.current = list._items[this.index];
this.index++;//index加1,以便下次调用MoveNext方法时,获取下一个元素
return true;
}
return this.MoveNextRare();
}
3、当在foreach中用其他集合时,foreach的内部实现机制和List泛型集合的实现大同小异。
|