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的操做 直到遍历完成

相关文章
相关标签/搜索