Si une exception est levée à partir IEnumerator .MoveNext () ou .Current, faut-il être encore disposé?

StackOverflow https://stackoverflow.com/questions/4416100

Question

Intuitivement, je pense que oui, mais je ne sais pas s'il y a une convention, je ne sais pas.

Était-ce utile?

La solution

Puisque nous ne pouvons pas savoir ce que la mise en œuvre est, la seule réponse sûre est « oui ».

Cependant, il est très rare d'utiliser IEnumerator directement - foreach être plus fréquents. Pour le IEnumerator<T> générique, vous pouvez utiliser une instruction en utilisant:

using(var iter = obj.GetEnumerator()) {
    ...
}

Même sans la version générique, vous pouvez tricher:

IEnumerator iter = obj.GetEnumerator();
using(iter as IDisposable) {
    ...
}

Ce qui va iter disposer si elle est IDisposable

Autres conseils

Aucun objet jetable doit être disposé, jamais. [1]

Mais ils devraient être. En tant que bloc using utilise la clause finally de disposer, ce qui est exécutée si le bloc de using est sorti normalement ou par une exception, la valeur par défaut est de disposer même en face d'une exception.


[1] Je suppose que l'on pourrait avoir une mise en œuvre bogué où une ressource non gérée est maintenue et il n'y a pas Finaliser, mais l'action correcte, il est de mettre en œuvre un Finaliser.

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