了解c#中的YIELD关键字

时间:2014-03-29 12:06:53

标签: c# yield-keyword

在阅读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有什么特别之处呢?

提前致谢:)

3 个答案:

答案 0 :(得分:1)

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

与第一个示例中一样,您可以迭代代码并返回"您访问时的每个值。这不是一个传统的回报,它的产量更多的是上下文切换到调用你的代码。下一次迭代将恢复你。

答案 1 :(得分:1)

关于yield的本质是它将实际执行推迟到真正查询该值的时间。换句话说,不是在您要求枚举器时评估特定值,而是在检索时进行评估(延迟评估)。

这有很多含义:

  • 不需要(可能是巨大的)资源分配来预先构建集合
  • 当枚举过早终止时,不得返回永不查询的值

答案 2 :(得分:0)

啊,但是有区别! yield return是一个语法糖,可以控制回调用函数。它提供了优化机会,因此如果您知道要在集合中查找某个值,则无需将整个集合返回给调用者,一旦获得所需内容,就可以将枚举短路。

那怎么做呢? yield return变为switch语句,如下所述:http://startbigthinksmall.wordpress.com/2008/06/09/behind-the-scenes-of-the-c-yield-keyword/

有一个非常好的视频也在这里解释:https://www.youtube.com/watch?v=Or9g8LOhXhg