首先什么样的数据才能实现foreach this
1 实现IEnumerable这个接口指针
2 有GetEnumerable()这个方法blog
而后为啥实现这个接口或者有这个方法就能够实现foreach遍历索引
首先我先用反编译器看看里面究竟是怎么实现的接口
而后我看了下 MoveNext的源码 get
public bool MoveNext() { if (this.version != this.list._version) { throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_EnumFailedVersion")); } if (this.index < this.endIndex) { this.currentElement = this.list[++this.index]; return true; } this.index = this.endIndex + 1; return false; }
和Current的源码编译器
public object Current { get { if (this.index < this.startIndex) { throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_EnumNotStarted")); } if (this.index > this.endIndex) { throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_EnumEnded")); } return this.currentElement; } }
MoveNext里面基本就是索引+1 而后用索引(index)来肯定currentElement源码
而Current里就是返回currentElementit
这么说来 就是MoveNext来推进索引 从而遍历io
foreach(var item in list)
如今咱们再来说讲foreach的全过程
首先复制须要索引的集合(list) 而后指针指向集合中第一位的前一个地址
而后开始执行 in 就是MoveNext执行的时候 推进指针 而后经过Current得到值 赋值给item
而后一直执行in 到item的操做 直到遍历完成