为了给出一个代码示例,假设您要编写一个迭代器,如果源为null或为空,则不返回任何内容.
public IEnumerableEnumerateThroughNull (IEnumerable source) { if (source == null) yield break; foreach (T item in source) yield return item; }
如果没有yield break,就不可能在迭代器中返回一个空集.
为了给出一个代码示例,假设您要编写一个迭代器,如果源为null或为空,则不返回任何内容.
public IEnumerableEnumerateThroughNull (IEnumerable source) { if (source == null) yield break; foreach (T item in source) yield return item; }
如果没有yield break,就不可能在迭代器中返回一个空集.
yield break指定该方法应该停止返回结果."返回"本身不够好,甚至可能导致错误,因为该方法的返回类型必须是IEnumerable.
我不确定为什么还需要return关键字.我最好的猜测是,它有助于使声明的意图更清晰一些.
如果您有兴趣,本文将介绍幕后产量
在C#yield关键字的幕后
产量休息和休息做完全不同的事情!看
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; } }
输出将是这些值的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.此外,对于这种反复的情况,难道你不认为收益率突破比回报更清晰吗?我亲自做.