什么是收益率突破的用途?

32 c# iterator yield

可能重复:
C#中的"yield break;"是什么?

任何人都可以看到使用"break"或"return"无法实现的"yield break"语句.

这句话似乎完全没用.更重要的是,如果没有这个陈述,"收益率返回X"语句可以简化为"收益率X",这更具可读性.

我错过了什么?

Cam*_*and 64

为了给出一个代码示例,假设您要编写一个迭代器,如果源为null或为空,则不返回任何内容.

public IEnumerable<T> EnumerateThroughNull<T>(IEnumerable<T> source)
{
    if (source == null)
        yield break;

    foreach (T item in source)
        yield return item;
}
Run Code Online (Sandbox Code Playgroud)

如果没有yield break,就不可能在迭代器中返回一个空集.

  • Yield Break 返回一个空的可枚举...本质上(在你的情况下)与“return new T[0]”相同,但不创建空数组。 (3认同)
  • 好吧,如果source!= null,我们可以只使if语句运行,但是点了 (2认同)

Bob*_*Bob 9

yield break指定该方法应该停止返回结果."返回"本身不够好,甚至可能导致错误,因为该方法的返回类型必须是IEnumerable.

我不确定为什么还需要return关键字.我最好的猜测是,它有助于使声明的意图更清晰一些.

如果您有兴趣,本文将介绍幕后产量

在C#yield关键字的幕后

  • @Dave,nope,yield break会停止返回的任何项目,但不会(也不能)取消已经返回的项目. (5认同)

Ray*_*yat 7

产量休息和休息做完全不同的事情!看

for(int i = 0; i < 10; ++i) {
   if(i > 5) { break; }
   yield return i;
}

for(int v = 2710; v < 2714; v+=2) {
   yield return v;
}

for(int s = 16; s < 147; ++s) {
   if(s == 27) { yield break; }
   else if(s > 17) { yield return s; }
}
Run Code Online (Sandbox Code Playgroud)

输出将是这些值的IEnumerable:0,1,2,3,4,5,2710,2712,18,19,20,21,22,23,24,25,26

这里有一些没有用处的方法,但它说明了你可以将yield break和break结合到同一个方法中,它们可以做两件不同的事情!Break只是突破循环,yield break完全结束了该方法.

我想没有使用返回的原因是因为你没有在方法中自己返回IEnumerable.此外,对于这种反复的情况,难道你不认为收益率突破比回报更清晰吗?我亲自做.