Как уничтожается Enumerator, созданный с помощью for в процессе строительства? - PullRequest
2 голосов
/ 18 февраля 2011

У меня есть коллекция, полученная из TCollection, реализующая GetEnumerator, поэтому я могу использовать ее в конструкции, подобной

for lElem in lCollection do

Перечислитель является производным от TObject, точно так же, как стандартные перечислители, поставляемые Delphi, и поэтому не делает 'у него нет владельца.

В справке Delphi упоминается, что если перечислитель поддерживает IDisposable, он будет утилизирован, но, разумеется, только для .NET.

Мне было интересно,как и когда и кем освобождается экземпляр перечислителя?

Ответы [ 2 ]

6 голосов
/ 18 февраля 2011

Для каждого оператора for-enum компилятор генерирует код, который примерно соответствует этому псевдокоду:

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

Приведенный выше код генерируется для перечислителей, которые реализованы как экземпляры классов.Если ваш перечислитель реализован как интерфейс, последняя строка не будет вызывать .Free, а просто уменьшит счетчик ссылок на интерфейс, позволяя уничтожить его.

1 голос
/ 18 февраля 2011

Он освобождается автоматически, когда он больше не нужен. Компилятор генерирует код, чтобы сделать это, так что вам не нужно. Когда происходит удаление, это деталь реализации.

...