2

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

for lElem in lCollection do

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

Delphi 帮助提到,如果枚举器支持 IDisposable,它将被丢弃,但这当然仅适用于 .NET。

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

4

2 回答 2

6

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

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

上面的代码是为作为类实例实现的枚举器生成的。如果您的枚举器被实现为接口,则最后一行不会调用 .Free ,而只是减少接口引用计数,使其被销毁。

于 2011-02-18T09:49:58.540 回答
1

一旦不再需要它就会自动释放。编译器会生成代码来执行此操作,因此您不需要这样做。处置发生的时间是实施细节。

于 2011-02-18T09:07:51.143 回答