【问题标题】:In c# does foreach call method in each loop? [duplicate]在 c# 中,foreach 是否在每个循环中调用方法? [复制]
【发布时间】:2015-05-20 11:29:07
【问题描述】:

我在我们的代码库中遇到了这个:

foreach (var evtType in EventLocator.GetTypes())

并记住 Shlemiel 画家的算法 方法 EventLocator.GetTypes() 是在每个循环上调用还是只调用一次?

【问题讨论】:

  • 这也是相关的,但作为重复关闭:How is foreach implemented in C#?
  • @Kobi 我知道为什么您将其标记为重复,但我在您链接的答案中看不到我的问题的答案,因为我想知道是否调用了返回集合的方法在每个循环上或仅一次。您链接的问题中的所有示例都使用了未从方法返回的预制集合。
  • 我只有在确保the answer 存在后才关闭,在“A foreach 循环 [...] 有点等同于”下。 var tmp = obj.GetEnumerator(); 表示该方法只调用一次,用于创建枚举器。

标签: c#


【解决方案1】:

在循环开始之前,被迭代的指定集合在概念上被捕获到一个局部变量中。它只执行一次。

你可以通过逻辑推导出这个事实。想象一下源是一个有状态的IEnumerable<T>。如果您丢弃旧对象并重新执行源表达式,您将如何继续循环?你不能索引到一个序列中。

【讨论】:

    【解决方案2】:

    不,它没有。 EventLocator.GetTypes() 将被编译器优化为外部范围内的变量

    【讨论】:

    • 这不是优化。这种行为是由语言规范强制执行的,不能以任何其他方式出现。
    • @usr 那么这是更好的行为:)
    猜你喜欢
    • 1970-01-01
    • 2017-03-12
    • 2014-10-09
    • 1970-01-01
    • 2014-10-30
    • 2016-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多