在foreach循环中使用集合

5

我正在使用foreach循环迭代一个集合,并且想知道当这段代码被.NET运行时执行时会发生什么。

foreach (object obj in myDict.Values) {
    //... do something
}

myDict.Values在每次循环中都会被调用吗?还是只会调用一次?

谢谢。

3个回答

9

只需要一次。大致相当于:

using (IEnumerator<Foo> iterator = myDict.Values.GetEnumerator())
{
    while (iterator.MoveNext())
    {
        object obj = iterator.Current;
        // Body
    }
}

请查看C# 4规范的第8.8.4节以获取更多信息。 特别是有关推断迭代元素类型、处理方式和C#编译器如何处理不实现IEnumerable或IEnumerable的类型的foreach循环的详细信息。

1
我敢打赌你已经熟记此部分了 :) - Florian Greinacher
你引用 C# 规范而非《深入浅出 C#》第二版,真高尚 :) - Adam Rackis

6

简短回答:它只被调用一次。


1
阐述一下:foreach 循环通过 IEnumerable 接口获取枚举器 (enumerator)(在你的集合上),并在每次循环中调用 Next() 方法。 - Sam Axe

2

该方法只会被调用一次,如果集合被修改将会生成异常。


是的,说得好。如果它只是类中的一个值,那么这不会影响它,但如果从集合中添加或删除项,则会出现问题。 - James

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接