suppose que j'ai« rendement » énumérations qui ne reçoivent pas « fini » par l'appelant - ce qui se passe
IEnumerable<string> Foo()
{
try
{
/// open a network connection, start reading packets
while(moredata)
{
yield return packet;
}
}
finally
{
// close connection
}
}
(Ou peut-être que je l'ai fait un « utilisant » - même chose). Que se passe-t-il si mon interlocuteur se déplace
var packet = Foo().First();
Je suis juste parti avec une fuite de connexion. Quand est-ce que finalement on se fait invoquer? Ou est-ce la bonne chose arrive toujours par magie
modifier avec la réponse et les pensées
Mon échantillon et d'autres « normal » (foreach, ..) les habitudes d'appel fonctionnera bien parce qu'ils disposent de la IEnumerable (en fait le IEnumerator retourné par GetEnumerator). Je dois donc avoir un appelant quelque part qui fait quelque chose de génial (obtenir explicitement un recenseur et ne pas le disposer ou similaire). Je les aurai tiré
le mauvais code de
J'ai trouvé un appelant à faire
IEnumerator<T> enumerator = foo().GetEnumerator();
changé à
using(IEnumerator<T> enumerator = foo().GetEnumerator())
Ma meilleure estimation: retourne seulement le premier 'packet' –
@MaciejLos Cela ne répond pas à la question qu'il a posée (?). – Servy
@Servy, je sais. C'est la raison pour laquelle j'ai posté un commentaire. Comme vous pouvez le voir, j'ai ajouté «?» À la fin de la déclaration, parce que je ne suis pas sûr. Merci pour votre commentaire. –