Ответ 1
Функция, вызываемая только один раз, возвращает IEnumerator<T>
; после этого метод MoveNext()
и свойство Current
используются для повторения результатов:
foreach (Foo f in GetFoos())
{
// Do stuff
}
несколько эквивалентен:
using (IEnumerator<Foo> iterator = GetFoos().GetEnumerator())
{
while (iterator.MoveNext())
{
Foo f = iterator.Current;
// Do stuff
}
}
Обратите внимание, что итератор расположен в конце - это особенно важно для размещения ресурсов из блоков итератора, например:
public IEnumerable<string> GetLines(string file)
{
using (TextReader reader = File.OpenText(file))
{
string line;
while ((line = reader.ReadLine()) != null)
{
yield return line;
}
}
}
В приведенном выше коде вы действительно хотите, чтобы файл был закрыт, когда закончите итерацию, и компилятор реализует IDisposable
хитро, чтобы сделать эту работу.