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