【问题标题】:How does the NerdDinner example's Dinner.GetRuleViolations function return a list?NerdDinner 示例的 Dinner.GetRuleViolations 函数如何返回列表?
【发布时间】:2009-07-30 20:13:04
【问题描述】:

根据我的阅读,

yield return <value> 

在执行该行的那一刻跳出函数。然而,Scott Guthrie 的文字表明

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");

这是如何工作的?

【问题讨论】:

    标签: c# asp.net-mvc nerddinner yield-return


    【解决方案1】:

    它不返回列表。它返回一个IEnumerable&lt;RuleViolation&gt;yield returniterator method 中返回一个值。迭代器是一种在方法中生成元素序列的简单方法。

    【讨论】:

      【解决方案2】:

      yield (C# reference)

      yield 关键字使用所谓的 懒惰的评价。这意味着什么 实际上是以下任何内容 不会评估“收益回报” 直到被要求 枚举器。

      还可以查看 Eric Lippert 关于迭代器块的博客。
      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
      @987654327 @

      【讨论】:

        【解决方案3】:

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

        更多信息:

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-09-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-03-18
          相关资源
          最近更新 更多