yield break in c#
它所做的是否与仅仅返回或让函数完成到最后有所不同?注意:vb.net没有yield break,但要求用迭代器关键字标记函数。
- 另请参见stackoverflow.com/questions/231893/…
- 没有那些例子说明yield break的作用,但是它不能解释是否仅仅简单的返回或者让函数自然退出有什么不同。
如果您想编写一个迭代器,而该迭代器在源为空或为空时不返回任何值,那么可以讨论C#。下面是一个例子:
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看作是不返回值的返回语句。
1 2 3 4 5 6 7 8 9
| int i = 0;
while (true)
{
if (i < 5)
yield return i;
else
yield break; // note that i++ will not be executed after this statement
i++;
} |
- yield break在该点结束枚举,在更复杂的枚举中,具有复杂的内部状态可能非常有用。然而,正如这个答案所暗示的那样,对于这个用例来说,它不是必需的。一个简单的if(来源!=空)foreach…..}将在空上返回空枚举,而不返回yield break。
- 在我写第一条评论的时候,我编辑了答案——这个评论适用于第一个例子。第二个例子是更复杂的状态,其中yield break有助于可读性。然而,没有它也不可能。例如,将第二个示例的else语句中的yield break更改为一个简单的break,以退出循环并到达函数的自然结尾,也会终止枚举。
- 好的,我认为答案是不需要。让一个函数自然完成也是可以的,相当于屈服断裂。
- "在没有yield break的迭代器中不可能返回空集"是误导性的——如果没有yield break的话这是不方便的。但很有可能。例如,在第一个示例中,您可以只使用if(source != null) { foreach (T item in source) yield return item; } ,它是一个迭代器块,生成一个空序列。