foreach的一點理解

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

相關文章
相關標籤/搜索