如何在构造中创建枚举器销毁?

Bas*_*scy 2 delphi enumerator delphi-2007

我有一个从TCollection派生的集合,实现了GetEnumerator,所以我可以在类似的结构中使用它

for lElem in lCollection do
Run Code Online (Sandbox Code Playgroud)

枚举器派生自TObject,与Delphi提供的标准枚举器完全相同,因此没有所有者.

Delphi帮助提到,如果枚举器支持IDisposable,它将被处理掉,但这只适用于.NET.

我想知道的是,枚举器实例如何以及何时以及由谁被释放?

gab*_*abr 6

对于每个for-enum语句,编译器生成的代码大致对应于此伪代码:

enumerator := list.GetEnumerator;
try
  while enumerator.MoveNext do
    do something with enumerator.Current;
finally
  enumerator.Free;
end;
Run Code Online (Sandbox Code Playgroud)

上面的代码是为实现为类实例的枚举器生成的.如果你的枚举器是作为接口实现的,那么最后一行不会调用.Free,只是减少接口引用计数,允许它被销毁.