仅当该foreach语句移至下一个项目时,迭代器块才评估下一个yield语句。
考虑以下示例:
private IEnumerable<int> Integers() { var i = 0; while(true) { Console.WriteLine("内部迭代器: " + i); yield return i; i++; } } private void PrintNumbers() { var numbers = Integers().Take(3); Console.WriteLine("Starting iteration"); foreach(var number in numbers) { Console.WriteLine("内部foreach: " + number); } }
这将输出:
开始迭代
内部迭代器:0
内部foreach:0
内部迭代器:1
内部foreach:1
内部迭代器:2
内部foreach:2
观看演示
作为结果:
即使在行打印之前调用了iterator方法,也会先打印“开始迭代”,因为该行Integers().Take(3);实际上并未开始迭代(未进行任何调用)IEnumerator.MoveNext()
打印到控制台的行在iterator方法内部的一个和迭代器方法内部的一个之间交替foreach,而不是迭代器方法内部的所有首先评估的行
该程序由于方法而终止,即使迭代器方法具有永不中断的方法。.Take()while true