我有一个从TCollection派生的集合,实现了GetEnumerator,所以我可以在像
这样的结构中使用它for lElem in lCollection do
枚举器派生自TObject,与Delphi提供的标准枚举器完全相同,因此没有所有者。
Delphi帮助提到,如果枚举器支持IDisposable,它将被处理掉,但那当然只适用于.NET。
我想知道的是,如何以及何时以及由谁释放枚举器实例?
答案 0 :(得分:6)
对于每个for-enum语句,编译器生成的代码大致对应于此伪代码:
enumerator := list.GetEnumerator;
try
while enumerator.MoveNext do
do something with enumerator.Current;
finally
enumerator.Free;
end;
上面的代码是为实现为类实例的枚举器生成的。如果你的枚举器是作为一个接口实现的,那么最后一行不会调用.Free,只是减少接口引用计数,允许它被销毁。
答案 1 :(得分:1)
一旦不再需要它就会自动释放。编译器生成代码来执行此操作,以便您不需要。处理发生时是一个实施细节。