Мы пытаемся использовать IEnumerable
как factory, который генерирует разные объекты каждый раз, когда мы перебираем его. Те должны быть GC'ed как можно скорее. Обратите внимание, однако, что мы сохраняем ссылку на перечислитель, чтобы мы могли снова позвонить ему. Поэтому наша программа в основном выглядит так:
public class YieldSpec
{
public static IEnumerable<string> Strings()
{
yield return "AAA";
yield return "BBB";
yield return "CCC";
}
public void YieldShouldAllowGC()
{
var e = Strings();
foreach (var a in e)
{
Console.WriteLine(a);
}
}
}
Глядя на этот код в отладчике:
Вы можете видеть, что при достижении точки останова IEnumerable имеет ссылку на "CCC" .
Это не должно произойти. IEnumerable должен генерировать только IEnumerator при вызове GetEnumerator. Является ли это ожидаемым поведением, что IEnumerable может содержать состояние?