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

时间:2011-02-18 08:57:44

标签: delphi delphi-2007 enumerator

我有一个从TCollection派生的集合,实现了GetEnumerator,所以我可以在像

这样的结构中使用它
for lElem in lCollection do

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

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

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

2 个答案:

答案 0 :(得分:6)

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

enumerator := list.GetEnumerator;
try
  while enumerator.MoveNext do
    do something with enumerator.Current;
finally
  enumerator.Free;
end;

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

答案 1 :(得分:1)

一旦不再需要它就会自动释放。编译器生成代码来执行此操作,以便您不需要。处理发生时是一个实施细节。