for-in循环是否计算其收集部分一次?

时间:2014-01-25 07:46:25

标签: delphi

我有一个函数可以生成一个数组作为结果,并希望迭代其结果以执行某些操作:

for MyElm in AFunction(SomeVar) do
begin
  //...
end;

因为集合部分是函数的结果,所以确保它只执行一次是很重要的。

问:每次迭代都会执行AFunction吗?

1 个答案:

答案 0 :(得分:9)

for循环开始时,该函数只被评估一次。循环的开始或结束是否由函数定义没有区别。

来自documentation

  

为了控制循环的执行,表达式initialValue和finalValue仅在循环开始之前计算一次

如果是您的特定代码

for MyElm in AFunction(SomeVar) do
begin
  //...
end;

在循环的第一次迭代中,编译器为函数调用返回的数组插入对GetEnumerator的调用。然后它开始在循环的每次迭代中调用枚举器的GetNext函数,并且只要它返回true,它就会使用枚举器的Current属性从数组中读取值。因此,仅在循环的初始迭代时调用该函数以检索该数组。之后,每次传递都会调用数组的枚举器,以便顺序遍历数组本身。

所以问题的答案是否定的。该函数不是“在其结果的每次迭代时执行”。该函数在循环开始时执行一次。