C# 理解c语言中的YIELD关键字#
我在阅读IEnumerable接口时遇到了这两个代码片段。我想简单地理解它们之间的确切区别 片段1:没有屈服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() {
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#,但我真的想开始使用它来实现这些功能。