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