Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如何使用for在构造中创建枚举器?_Delphi_Delphi 2007_Enumerator - Fatal编程技术网

Delphi 如何使用for在构造中创建枚举器?

Delphi 如何使用for在构造中创建枚举器?,delphi,delphi-2007,enumerator,Delphi,Delphi 2007,Enumerator,我有一个从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,而只是减少接口引用计数以允许销毁它。

实际上,它位于隐式
try…finally
块中;实际生成的代码还取决于枚举器的类型(类、记录或接口)。哦,我也知道“事实上的事情”@Jeroen:我本来想简明扼要,但总有人抱怨……;)我假设在使用记录时,try/finally被跳过,只要记录本身不包含托管类型。上面的例子是针对基于类的枚举数的。@gabr你大概是通过逆向工程推断出了这一切?我的断言是对的,这是一个实现细节,没有文档记录,在未来的版本中可能会发生更改?