Fondamentalement, c'est un oubli. En C# 1.0, foreach
jamais appelé Dispose
1. Avec C# 1.2 (présenté dans VS2003 - il n'y a pas de 1.1, bizarrement) foreach
a commencé à vérifier dans l' finally
bloc de si oui ou non l'itérateur mis en oeuvre IDisposable
- qu'ils avaient à faire de cette façon, parce que rétrospectivement rendant IEnumerator
étendre IDisposable
aurait brisé tout le monde de la mise en œuvre de l' IEnumerator
. Si ils avaient travaillé que c'est utile pour foreach
à disposer d'itérateurs en premier lieu, j'en suis sûr, IEnumerator
ont élargi IDisposable
.
Quand C# 2.0 et .NET 2.0 est sorti, cependant, ils avaient une nouvelle occasion - une nouvelle interface, de nouveaux de succession. Il fait beaucoup plus de sens d'avoir l'interface étendre IDisposable
, de sorte que vous n'avez pas besoin d'un temps d'exécution vérifier dans le bloc finally, et maintenant que le compilateur sait que si l'itérateur est un IEnumerator<T>
il peut émettre un inconditionel de Dispose
.
EDIT: C'est incroyablement utile pour Dispose
d'être appelé à la fin de l'itération (mais il se termine). Il signifie que l'itérateur peut tenir à des ressources - qui rend possible pour elle, dire, lire un fichier ligne par ligne. Itérateur blocs générateur Dispose
des implémentations qui assurez-vous que tout finally
blocs le point en cours d'exécution" de l'itérateur sont exécutés lorsqu'il est éliminé - de sorte que vous pouvez écrire du code à l'intérieur de l'itérateur et le nettoyage doivent se produire de façon appropriée.
1 la Recherche de retour à l'1.0 spec, il a déjà été spécifié. Je n'ai pas encore été en mesure de vérifier cette déclaration plus tôt que la 1.0 mise en œuvre n'a pas d'appel Dispose
.