NerdDinner 示例的 Dining.GetRuleViolations 函数如何返回列表?
根据我的阅读,
yield return <value>
该行执行时就会跳出该函数。 然而,Scott Guthrie 的文本表明,
var errors = dinner.GetRuleViolations();
列表,也成功地提取了所有规则违规的列表。
if(String.someFunction(text))
yield return new RuleViolation("Scary message");
if(String.anotherFunction(text))
yield return new RuleViolation("Another scary message");
即使 GetRuleViolations 是一个很长的“这是如何工作的?”
From what I've read,
yield return <value>
jumps out of the function the moment the line is executed. However, Scott Guthrie's text indicates that
var errors = dinner.GetRuleViolations();
successfully pulls out a list of all the rule violations even though GetRuleViolations is a long list of
if(String.someFunction(text))
yield return new RuleViolation("Scary message");
if(String.anotherFunction(text))
yield return new RuleViolation("Another scary message");
How does this work?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
它不返回列表。 它返回一个
IEnumerable
。yield return
返回 迭代器方法。 迭代器是在方法中生成元素序列的一种简单方法。It doesn't return a list. It returns an
IEnumerable<RuleViolation>
.yield return
returns a value in an iterator method. An iterator is an easy way to generate a sequence of elements in a method.请参阅产量(C# 参考)
另请参阅 Eric Lippert 关于迭代器块的博客。
第 1 部分
第 2 部分 - 为什么没有 Ref 或 Out 参数
第 3 部分 - 为什么最后没有收益
第 4 部分 - 为什么渔获量没有产量
第 5 部分- 推与拉
第 6 部分 - 为什么没有不安全代码
See yield (C# reference)
Also have a look at Eric Lippert's blog on Iterator Blocks.
Part 1
Part 2 - Why No Ref or Out Parameters
Part 3 - Why No yield in finally
Part 4 - Why No yield in catch
Part 5 - Push vs Pull
Part 6 - Why no unsafe code
它之所以有效,是因为
yield return
返回一个值到枚举器对象,基本上为您自动化了一些管道代码(即它是语法糖)。 它不会导致方法返回,这将是yield break
。详细信息:
yield
关键字< /a>yield
为了可读性...It works because
yield return
returns a value to an enumerator object, basically automating some plumbing code for you (i.e. it's syntactic sugar). It doesn't cause the method to return, that would beyield break
.More information:
yield
keywordyield
for readability...