通过foreach使用yield可以提升性能吗?

Ael*_*eis 2 c# foreach

阅读几篇文章后:http : //csharpindepth.com/Articles/Chapter6/IteratorBlockImplementation.aspx http://msdn.microsoft.com/en-us/library/9k7k7cf0.aspx

有一点我不太明白并且很好奇.

我很想知道foreach循环可以在所有产量完成之前利用产生函数的结果.

以下功能为例:

    public static IEnumerable<int> RandomFunction()
    {
        for (int i = 0; i < int.MaxValue; i++)
            yield return i; 
    }

    public static void PrintRandomResult1()
    {
        foreach (var i in RandomFunction())
            Console.WriteLine(i);
    }

    public static void PrintRandomResult2()
    {
        IEnumerable<int> Enumerable = RandomFunction();
        foreach(var i in Enumerable)
            Console.WriteLine(i);
    }
Run Code Online (Sandbox Code Playgroud)

如果我们使用PrintRandomResult2,我会假设随机函数在foreach生物之前已经达到了它的所有产量; 但是,如果我们直接在foreach中调用RandomFunction,迭代会在RandomFunction完成之前开始吗?

Jon*_*eet 6

我很想知道foreach循环可以在所有产量完成之前利用产生函数的结果.

当然,这是重点.迭代器块懒惰地执行.

该方法在命中时有效地"暂停" yield return- 然后在下一次foreach循环隐式调用时继续MoveNext().它只是贯穿整个代码并构建一个列表以在最后返回,如果这是你猜测的.

从您链接到的MSDN页面:

yield return在iterator方法达到语句,表达被返回,而在代码的当前位置被保留.下次调用迭代器函数时,将从该位置重新开始执行.

编辑:您已经链接到我的实施文章 - 更多介绍性文章可能对您有所帮助,因为这给出了一个有用的例子.