为什么yield关键字与return和break结合使用,而不是单独使用?


11

在C#中,您可以构造返回类型为IEnumerable<T>和并使用yield returnyield break控制流程的方法。这是使用两个控件的简单示例:

public IEnumerable<int> GetEvens(int start, int end) {
    if(end < start)
        yield break;

    if(start & 2 != 0)
        start++;

    for(int i = start; i <= end; i+=2) {
        yield return i;
    }        
}

我的问题是,为什么它最初设计为与一起使用两个关键字,yield而不是像下面那样使用单个关键字yield“产生返回值”来使用它:

public IEnumerable<int> GetEvens(int start, int end) {
    if(end < start)
        return; // stop completely and return nothing

    if(start & 2 != 0)
        start++;

    for(int i = start; i <= end; i+=2) {
        yield i; // yield the current value.
    }        
}

对我来说,这更容易阅读和理解。

Answers:


13

yield return创建了稍微笨拙的语法,以使使用单词“ yield”作为标识符(变量名)的现有代码不会中断。(例如,yield如果您使用的是财务代码,则命名一个变量是很有意义的。)由于“收益回报”当时是语法错误,因此新语法不会破坏任何现有代码。

至于yield break,不知道。我发现这似乎没有任何很好的理由。


yield x;那时也不会出现语法错误吗?
Moop

1
@Moop:通过创建它yield return,您甚至不必费心考虑它是否是语法错误。碰撞的机会为零。
罗伯特·哈维

2
对于“收益率突破;”,本质上类似于“回报”;以无效方法,但使用“返回”;结合“收益率回报”;可能会造成混乱。因此,选择“收益率中断”是选择“收益率收益”的结果。
Cyanfish

3
@Moop如果您有一个名为的类型,yieldyield x;不会是语法错误,而是有效的变量声明。
Bojan Resnik

1
@moop:另请参见ericlippert.com/2009/05/11/reserved-and-contextual-keywordsblogs.msdn.com/b/ericlippert/archive/2010/09/27/…如果引入新关键字的主题没有破坏任何代码都会使您感兴趣。
埃里克·利珀特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.