2

TCollectionから派生したコレクションがあり、GetEnumeratorを実装しているため、次のような構造で使用できます。

for lElem in lCollection do

列挙子は、Delphiが提供する標準の列挙子とまったく同じように、TObjectから派生しているため、所有者はありません。

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 に答える