Je suppose que j'ai
IEnumerable<string> Foo()
{
try
{
/// open a network connection, start reading packets
while(moredata)
{
yield return packet;
}
}
finally
{
// close connection
}
}
(Ou peut-être que j'ai fait une "utilisation" - même chose). Que se passe-t-il si mon interlocuteur va
var packet = Foo().First();
Je me retrouve avec une connexion qui fuit. Quand est-ce que l'on invoque enfin ? Ou est-ce que la bonne chose se produit toujours par magie
éditer avec la réponse et les pensées
Mon exemple et d'autres modèles d'appel "normaux" (foreach, ..) fonctionnent bien car ils se débarrassent de l'IEnumerable (en fait l'IEnumerator renvoyé par GetEnumerator). Je dois donc avoir un appelant quelque part qui fait quelque chose de funky (obtenir explicitement un énumérateur et ne pas le disposer ou autre). Je vais les faire tirer
le mauvais code
J'ai trouvé un appelant faisant
IEnumerator<T> enumerator = foo().GetEnumerator();
changé en
using(IEnumerator<T> enumerator = foo().GetEnumerator())