【问题标题】:verbosity of yield syntax [closed]产量语法的冗长[关闭]
【发布时间】:2012-06-30 21:50:03
【问题描述】:

我有一个有趣的问题。根据MSDN产量syntax

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

为什么不只是:

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

对我来说,第二种形式会不那么冗长,但仍然与第一种形式具有相同的含义。 所以问题是 - 为什么 .NET 设计人员选择了第一种形式?什么原因可能导致这种情况?第二种形式有哪些潜在的设计问题?

【问题讨论】:

  • 不那么冗长:是的,但它也更清晰吗?
  • 这有什么不清楚的地方? return 部分?将新关键字投入语言并不总是会导致更清晰的方式...
  • 如何区分正常回报;并返回;迭代器??
  • 简单 - 如果方法实现 IEnumerable - return 功能为 yield break,否则 - 和旧的 return 一样......

标签: c# yield


【解决方案1】:

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

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

考虑以下代码:

yield variable;

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

对于像 C# 这样设计为易于编写和维护的复杂语言,您希望语句只有一个含义。如果 return 根据您是否在迭代器中做了不同的事情,您可能会在语言上遇到严重的限制。

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

【讨论】:

  • +1 让我觉得这应该是公认的答案,因为它包含了权威来源与公认的答案是(非常有根据的)猜测。
【解决方案2】:

这是一种可能性:它会造成技术上的歧义(请记住,yieldcontextual 关键字,而不是 保留 关键字)...不太可能,但是:

struct yield {}

然后

yield x;

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

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

【讨论】:

  • +1。好点。对我而言,上下文关键字闻起来像 .NET,应该以没有上下文关键字的方式重新设计 - 用普通的保留关键字替换它们。所以这似乎是某种向后兼容的设计技巧:-)
  • @0x69 好吧,“设计黑客”可能是“添加语言功能”的别称
【解决方案3】:

return 语句的唯一含义是它必须返回方法返回类型的表达式。由于迭代器没有void 返回类型,使用return 语句退出迭代器不符合这个含义,因为您没有“返回”任何东西。

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

【讨论】:

  • 呵呵,yield break 也不返回任何东西...
  • 我的观点完全正确。 return 应该总是返回一些东西,yield break 没有。
  • 你错过了void 也不会返回任何东西的函数。
  • @0x60 我明白你的意思。在void 函数中,这是有道理的,因为该函数实际上不返回值。然而,在迭代器中,情况并非如此。我已经更新了我的答案来解决这个问题。
  • 迭代器中有趣的部分是您看不到完全返回迭代器对象的代码 - 类似于return Enumerator。我们推断它只从函数定义中返回枚举器对象——这是自相矛盾的设计。
猜你喜欢
  • 2014-01-17
  • 2014-07-01
  • 1970-01-01
  • 2011-05-01
  • 2020-03-28
  • 2019-11-24
  • 2012-12-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多