【问题标题】:yield break in c# [duplicate]c#中的产量中断[重复]
【发布时间】:2012-11-11 12:31:39
【问题描述】:

除了从函数返回或让函数完成到最后,它有什么不同吗?注意 VB.NET 没有 yield break,但需要用 iterator 关键字标记函数。

【问题讨论】:

标签: c# vb.net iterator


【解决方案1】:

谈到C#,如果你想编写一个迭代器,如果源为空或为空则不返回任何内容。这是一个例子:

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 视为不返回值的返回语句。

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 (source != null) { foreach ..... } 将在 null 上返回一个空枚举,而不会产生中断。
  • 答案是在我写第一个评论时编辑的——评论适用于第一个例子。第二个是具有更复杂状态的示例,其中 yield break 有助于提高可读性。然而,没有它也不是不可能的。例如,将第二个示例的 else 语句中的 yield break 更改为简单的 break,以逃避循环并到达函数的自然结束也将终止枚举。
  • 好的,我认为答案是不需要。让函数自然完成也可以,相当于yield break
  • “如果没有yield break,就不可能在迭代器中返回一个空集”是误导性的——如果你没有yield break,这只是不方便。但很有可能。例如,在您的第一个示例中,您可以只使用 if(source != null) { foreach (T item in source) yield return item; } - 它是一个产生空序列的迭代器块。
猜你喜欢
  • 2017-12-01
  • 2013-01-29
  • 2011-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-23
  • 2014-02-11
相关资源
最近更新 更多