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