2

从我读到的,

yield return <value> 

在执行该行的那一刻跳出函数。然而,斯科特·格思里的文字表明

var errors = dinner.GetRuleViolations();

即使 GetRuleViolations 是一长串

if(String.someFunction(text))
    yield return new RuleViolation("Scary message");
if(String.anotherFunction(text))
    yield return new RuleViolation("Another scary message");

这是如何运作的?

4

3 回答 3

6

它不返回列表。它返回一个IEnumerable<RuleViolation>. 在迭代器方法yield return中返回一个值。迭代器是一种在方法中生成元素序列的简单方法。

于 2009-07-30T20:16:11.990 回答
3

请参阅产量(C# 参考)

yield 关键字使用所谓的惰性求值。这实际上意味着在“收益回报”之后的任何东西都不会被评估,直到它被普查员要求。

还可以查看 Eric Lippert 关于迭代器块的博客。
第 1
部分 第 2 部分 - 为什么没有 Ref 或 Out 参数
第 3 部分 - 为什么 finally 没有 yield
第 4 部分 - 为什么 catch 中没有 yield
第 5 部分 - 推与拉
第 6 部分 - 为什么没有不安全的代码

于 2009-07-30T20:24:14.313 回答
0

它之所以起作用,是因为yield return将一个值返回给一个枚举器对象,基本上为您自动执行一些管道代码(即它是语法糖)。它不会导致方法返回,那就是yield break.

更多信息:

于 2009-07-30T20:23:55.407 回答