предположим, что
IEnumerable<string> Foo()
{
try
{
/// open a network connection, start reading packets
while(moredata)
{
yield return packet;
}
}
finally
{
// close connection
}
}
(Или, может быть, я "использовал" - то же самое). Что произойдет, если мой вызывающий абонент отправится
var packet = Foo().First();
Я просто остался с просочившейся связью. Когда наконец вызывается? Или правильная вещь всегда происходит по волшебству
редактировать с ответом и мыслями
Мой образец и другие "нормальные" (foreach,..) вызовы будут работать хорошо, потому что они избавляются от IEnumerable (фактически IEnumerator, возвращаемого GetEnumerator). Поэтому я должен иметь вызывающего абонента, который делает что-то напуганное (явно получая перечислитель, а не удаляя его или тому подобное). Я их расстреляю
плохой код
Я нашел вызывающего пользователя
IEnumerator<T> enumerator = foo().GetEnumerator();
изменено на
using(IEnumerator<T> enumerator = foo().GetEnumerator())