Delphi 如何使用for在构造中创建枚举器?
我有一个从TCollection派生的集合,实现了GetEnumerator,这样我就可以在类似Delphi 如何使用for在构造中创建枚举器?,delphi,delphi-2007,enumerator,Delphi,Delphi 2007,Enumerator,我有一个从TCollection派生的集合,实现了GetEnumerator,这样我就可以在类似 for lElem in lCollection do 枚举器是从TObject派生的,与Delphi提供的标准枚举器完全相同,因此没有所有者 Delphi帮助提到,如果枚举器支持IDisposable,它将被丢弃,但这当然只适用于.NET 我想知道的是,如何、何时以及由谁来释放枚举器实例?一旦不再需要它,它就会自动释放。编译器生成代码来执行此操作,这样您就不需要这样做了。处理发生时是一个实现细节
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,而只是减少接口引用计数以允许销毁它。实际上,它位于隐式
try…finally
块中;实际生成的代码还取决于枚举器的类型(类、记录或接口)。哦,我也知道“事实上的事情”@Jeroen:我本来想简明扼要,但总有人抱怨……;)我假设在使用记录时,try/finally被跳过,只要记录本身不包含托管类型。上面的例子是针对基于类的枚举数的。@gabr你大概是通过逆向工程推断出了这一切?我的断言是对的,这是一个实现细节,没有文档记录,在未来的版本中可能会发生更改?