C #: Où mettre en œuvre une coutume IEnumerator
-
19-09-2019 - |
Question
Dire que j'ai une classe qui implémente IEnumerable<T>
. Il utilise actuellement le mot-clé yield
dans la méthode GetEnumerator()
. Mais maintenant, je dois faire un peu plus, par exemple, je voudrais nettoyer après moi-même. Pour ce faire, à moins d'avoir oublié quoi que ce soit, je dois implémenter l'interface IEnumerator<T>
. Mais où voulez-vous dire que je devrais le faire?
Si la classe elle-même mettre en œuvre GetEnumerator()
et retour this
? Ou serait-il préférable de le cacher dans une classe privée? Ou peut-être devrait-il être juste une classe totalement différente? Quelles sont les pratiques communes à ce sujet?
La solution
Si tout ce que vous devez faire est de nettoyer certaines ressources lorsque le recenseur est éliminé, comme à la fin d'une boucle de foreach
, alors vous pouvez le faire avec ce que vous avez, il suffit d'ajouter un bloc try / finally à votre iterator méthode.
Comme ceci:
public IEnumerator<T> GetEnumerator()
{
try
{
// your iterator code here
}
finally
{
// cleanup code here
}
}
C'est tout ce qu'il ya à faire.
Autres conseils
Je voudrais aller avec une classe pour la IEnumerator
Vous ne pouvez pas besoin d'écrire classe pour cela du tout. Une méthode iterator peut retourner IEnumerable<T>
, donc si votre classe n'a besoin que de mettre en œuvre IEnumerable<T>
et rien d'autre, il suffit d'écrire une méthode iterator pour la chose.
Dans le cas contraire, et vous devez en tenir à une classe extérieure qui implémente IEnumerable<T>
en ayant une méthode iterator pour faire GetEnumerator
, alors vous ne devez pas faire quoi que ce soit très difficile à nettoyer après itération.
IEnumerator<T>
dérive de IDisposable
. Procédé d'itérateur implémente Dispose
en exécutant les blocs de finally
ou tout code après la dernière yield return
.