C# 理解c语言中的YIELD关键字#

C# 理解c语言中的YIELD关键字#,c#,yield-keyword,C#,Yield Keyword,我在阅读IEnumerable接口时遇到了这两个代码片段。我想简单地理解它们之间的确切区别 片段1:没有屈服 public IEnumerator GetEnumerator() { // Return the array object's IEnumerator. return carArray.GetEnumerator(); } 片段2:有收益 public IEnumerator GetEnumerator() {

我在阅读IEnumerable接口时遇到了这两个代码片段。我想简单地理解它们之间的确切区别

片段1:没有屈服

    public IEnumerator GetEnumerator()
    {
        // Return the array object's IEnumerator.
        return carArray.GetEnumerator();
    }
片段2:有收益

    public IEnumerator GetEnumerator()
    {
        foreach (Car c in carArray)
        {
            yield return c;
        }
    }
这两个代码段做相同的工作,那么在这里使用YIELD有什么特别之处呢


提前感谢:)

yield return将有状态序列代码转换为迭代器


不像在第一个示例中那样,使用单独的类来管理迭代器位置,您可以在代码中进行迭代,并在访问时“返回”每个值。这不是一个常规的返回,这是一个收益,更像是一个上下文切换到调用您的代码。下一次迭代将继续进行。

关于收益率的本质是,它将实际执行推迟到真正查询值的时间。换句话说,特定值不是在您请求枚举数时求值,而是在检索值时求值(惰性求值)

这有许多影响:

  • 不需要(潜在的巨大)资源分配来预先构建集合
  • 当枚举提前终止时,决不能返回从未查询过的值

啊,但是有区别
yield return
是一种语法上的糖分,它将控制权返回给调用函数。它提供了优化机会,因此,如果您知道要在集合中查找某个值,则不必将整个集合返回给调用者,您可以在获得所需值后立即中断枚举

那么它是如何做到的呢<代码>收益返回转换为switch语句,如下所述:


这里有一个非常好的视频也解释了这一点:

在这个特定的案例中,如果carArray真的是它听起来的样子,那么可能没有太大的收益,一个
数组
汽车
元素。谢谢,添加了一些细节。坦白:我不知道c#,但我真的想开始使用它来实现这些功能。