c#语言的惰性计算

示例

仅当该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