首先什么樣的數據才能實現foreach
1 實現IEnumerable這個接口
2 有GetEnumerable()這個方法
然后為啥實現這個接口或者有這個方法就可以實現foreach遍歷
首先我先用反編譯器看看里面到底是怎么實現的

然后我看了下 MoveNext的源碼
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里就是返回currentElement
這么說來 就是MoveNext來推動索引 從而遍歷
foreach(var item in list)
現在我們再來講講foreach的全過程
首先復制需要索引的集合(list) 然后指針指向集合中第一位的前一個地址
然后開始執行 in 就是MoveNext執行的時候 推動指針 然后通過Current獲得值 賦值給item
然后一直執行in 到item的操作 直到遍歷完成
新聞熱點
疑難解答