产量语法的冗长

时间:2012-06-30 21:50:04

标签: c# yield

我有一个有趣的问题。根据MSDN收益率syntax

yield return <expression>; // yield some value
yield break;               // exiting from iterator

为什么不呢:

yield <expression>;        // yield some value
return;                    // exiting from iterator

对我来说,第二种形式会更简洁,但仍然具有与第一种形式相同的含义。 所以问题是 - 为什么.NET设计者选择了第一种形式?可能是什么原因造成的?第二种形式有哪些潜在的设计问题?

3 个答案:

答案 0 :(得分:5)

没有使用yield本身的主要原因是它会引入一个新关键字,并且在处理旧代码时可能会破坏向后兼容性。

正因为如此,C#语言团队决定将yield设为上下文关键字(在returnbreak后面只有一个关键字。)

请考虑以下代码:

yield variable;

yield可以是classstruct的名称,此语句可以是变量声明。

使用像C#这样易于编写和维护的复杂语言,您希望语句只有一个含义。如果return做了不同的事情,取决于你是否在迭代器中,你可能会严重限制语言。

http://blogs.msdn.com/b/ericgu/archive/2006/03/08/546296.aspx

答案 1 :(得分:4)

这是一种可能性:它会产生技术歧义(请记住yield上下文关键字,而不是保留关键字)...不太可能,但是:

struct yield {}

然后

yield x;

实际上是变量声明。使用“yield return x;”,这只是一种有效的方式。

不知道这是不是真的。只是一个想法。

答案 2 :(得分:2)

return语句具有单一含义,即必须返回方法返回类型的表达式。由于迭代器没有void返回类型,因此使用return语句退出迭代器并不符合这个含义,因为您没有“返回”任何内容。

yield break表示迭代器应退出而不返回任何其他元素。恕我直言,这使得yield break语句比为此目的使用return语句更清晰。