What's the use of yield break?
Possible Duplicate:
What does"yield break;" do in C#?
任何人都能看到使用"break"或"return"无法实现的"yield break"语句的用法吗?
这句话似乎毫无用处。此外,如果没有这个语句,"yield return x"语句可以简化为"yield x",这更易于阅读。
我错过了什么?
为了给出一个代码示例,假设您想编写一个迭代器,如果源为空或为空,则该迭代器不返回任何内容。
1 2 3 4 5 6 7 8 | public IEnumerable<T> EnumerateThroughNull<T>(IEnumerable<T> source) { if (source == null) yield break; foreach (T item in source) yield return item; } |
如果没有yield break,就不可能在迭代器中返回空集。
yield break指定该方法应停止返回结果。""返回"本身就不够好,甚至可能导致错误,因为方法的返回类型必须是IEnumerable。
我不知道为什么还需要返回关键字。我的最佳猜测是,这有助于使声明的意图更加清楚。
如果您感兴趣,本文将解释yield在幕后的作用。
在c yield关键字的幕后
屈服,休息,做完全不同的事情!看
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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; } } |
输出将是这些值中的一个整数:0、1、2、3、4、5、2710、2712、18、19、20、21、22、23、24、25、26
这里有一些方法没有任何用处,但它说明您可以将yield break和break组合成相同的方法,它们可以做两个不同的事情!断开只是跳出了循环,屈服断开完全结束了方法。
我猜没有使用返回的原因是因为您没有在方法中返回IEnumerable。此外,对于这种迭代的情况,你不认为收益率突破比回报更清楚吗?我亲自去做。
在迭代器块中使用
如果您有这样的迭代器函数:
1 | public IEnumerable<int> IteratorOverInt() { } |
上面函数中的RETURN语句需要返回一个已填充的
1 2 3 |
但是,如果您正在使用迭代器函数,那么您将使用
1 2 3 4 5 | public IEnumerable<int> IteratorOverInt() { for (int i = 0; i < 4; i++) { yield return i; } } |
因此,
在上述情况下,
因此,我们需要一种在迭代器块中有意义的到
当然,您可以使用
您需要区分返回已经存在的IEnumerable实现(也许您将返回一个列表)和匿名迭代器。
不能只使用回车或换行,因为它们是有效的关键字,可以用于其他目的。您也不能单独使用yield,因为您需要有一种方法来指定是返回枚举中的项,还是结束枚举,因此需要yield返回和yield break。