Comment l'énumérateur est-il créé avec dans la construction détruite?
-
15-11-2019 - |
Question
J'ai une collection dérivée de tcollection, implémentant Genenumerator afin que je puisse l'utiliser dans une construction comme
for lElem in lCollection do
L'énumérateur est dérivé de Tobject, exactement comme les énumérateurs standard fournis par Delphi et n'a pas de propriétaire.
L'aide Delphi mentionne que si l'énumérateur prend en charge iDisposable, il sera éliminé, mais c'est pour .NET seulement bien sûr.
Ce que je me demandais, c'est comment et quand et par qui l'instance de l'énumérateur est libérée?
La solution
Pour chaque compilateur d'instruction FOR-ENUM génère du code qui correspond à peu près à ce pseudocode:
enumerator := list.GetEnumerator;
try
while enumerator.MoveNext do
do something with enumerator.Current;
finally
enumerator.Free;
end;
Le code ci-dessus est généré pour les énumérateurs qui sont implémentés sous forme d'instances de classe. Si votre énumérateur est implémenté en tant qu'interface, la dernière ligne n'appellerait pas le nombre de références à l'interface libre mais simplement décrément permettant de la détruire.
Autres conseils
Il est libéré automatiquement une fois qu'il n'est plus nécessaire. Le compilateur génère du code pour ce faire pour que vous n'ayez pas besoin. Lorsque l'élimination se produit est un détail de mise en œuvre.