【问题标题】:Collections use in foreach loopforeach 循环中使用的集合
【发布时间】:2011-11-12 03:24:40
【问题描述】:

我正在遍历 foreach 循环中的集合,并且想知道。 当它被 .NET 运行时执行时

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

是每个循环都调用 myDict.Values 还是只调用一次?

谢谢,

【问题讨论】:

    标签: c# .net foreach


    【解决方案1】:

    只有一次。大致相当于:

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

    有关详细信息,请参阅 C# 4 规范的第 8.8.4 节。特别是有关推断的迭代元素类型、处置以及 C# 编译器如何处理未实现 IEnumerableIEnumerable&lt;T&gt; 的类型的 foreach 循环的详细信息。

    【讨论】:

    • 我敢打赌你已经熟记这个部分了 :)
    • 各位高人引用 C# Spec 而不是 C# 的深度,第二版 :)
    【解决方案2】:

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

    【讨论】:

    • 说明:foreach 抓取 Enumerator(通过集合上的 IEnumerable 接口)并在每次循环中调用 Next()。
    【解决方案3】:

    它被调用一次,如果集合被修改会产生一个异常。

    【讨论】:

    • 是的,好点。如果它只是一个类中的一个值,那么这不会影响它,但是如果从集合中添加或删除项目,这是一个问题。
    猜你喜欢
    • 2013-10-09
    • 2013-04-26
    • 1970-01-01
    • 2018-11-18
    • 2010-11-10
    • 2019-08-21
    • 1970-01-01
    • 2018-05-13
    • 2018-06-20
    相关资源
    最近更新 更多