我在代码库中遇到过这个问题:
foreach (var evtType in EventLocator.GetTypes())
并且记住 Shlemiel画家的算法方法EventLocator.GetTypes()
是在每个循环上调用还是只调用一次?
答案 0 :(得分:11)
迭代的指定集合在循环开始之前被概念性地捕获到局部变量中。它只执行一次。
你可以通过逻辑推导出这个事实。想象一下,源是一个有状态的IEnumerable<T>
。如果丢弃旧对象并重新执行源表达式,您将如何继续循环?您无法将索引编入索引。
答案 1 :(得分:0)
不,它没有。 EventLocator.GetTypes()
将由编译器优化到外部作用域中的变量