C# foreach循环中使用的集合

C# foreach循环中使用的集合,c#,.net,foreach,C#,.net,Foreach,我正在foreach循环中迭代一个集合,我想知道。 当.NET运行时执行此操作时 foreach (object obj in myDict.Values) { //... do something } myDict.Values是为每个循环调用还是只调用一次 谢谢,简短回答:只叫一次。就一次。这大致相当于: using (IEnumerator<Foo> iterator = myDict.Values.GetEnumerator()) { while (iter

我正在foreach循环中迭代一个集合,我想知道。 当.NET运行时执行此操作时

foreach (object obj in myDict.Values) {
    //... do something
}
myDict.Values是为每个循环调用还是只调用一次


谢谢,

简短回答:只叫一次。

就一次。这大致相当于:

using (IEnumerator<Foo> iterator = myDict.Values.GetEnumerator())
{
    while (iterator.MoveNext())
    {
        object obj = iterator.Current;
        // Body
    }
}
使用(IEnumerator迭代器=myDict.Values.GetEnumerator())
{
while(iterator.MoveNext())
{
objectobj=iterator.Current;
//身体
}
}

有关更多信息,请参见C#4规范第8.8.4节。特别是关于推断的迭代元素类型、处置、,以及C#编译器如何处理
foreach
在未实现
IEnumerable
IEnumerable
的类型上的循环,它被调用一次,如果集合被修改,将生成异常。

详细说明:foreach获取枚举器(通过集合上的IEnumerable接口)并调用Next()每次循环。我打赌你都会记住这一部分:)你真是太好了,引用C#Spec而不是C#depth,第二版:)是的,很好。如果它只是类中的一个值,则不会对其产生影响,但如果在集合中添加或删除项,则会出现问题。