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?

Était-ce utile?

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 . Cela devra stocker l'état (position actuelle) qui ne fait pas partie de la collection, mais une partie du processus de dénombrement.

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top