首先什麼樣的數據才能實現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的操做 直到遍歷完成