【问题标题】:What is the purpose of Yield and how does it work?Yield 的目的是什么,它是如何工作的?
【发布时间】:2016-07-05 10:08:24
【问题描述】:

在阅读 Twitter 时,我发现了我关注的一位游戏开发者的推文,上面说的是;

@ChevyRay2:44 AM - 5 Jul 2016
我给你:我写过的最愚蠢的 8 行代码,实际上被我的游戏代码使用了

static IEnumerable<int> RightAndleft
{
    get
    {
        yield return 1;
        yield return -1;
    }
}

我立刻看着它,心想这是做什么的?我确定这篇文章是开玩笑的,但我只是没有明白。因此,我去研究了yield,但这并没有真正回答我的问题。

我想知道这里是否有人可以首先阐明它在做什么以及为什么。

【问题讨论】:

  • 它返回 2 个整数,左右分别为 1 和 -1 ..
  • 感谢@BugFinder 的快速回复,但这就是我想要理解的,一个属性如何返回两个值,这是yield 允许你做的吗?我想我只是不明白语法?
  • 这里有很多编译器魔法。看看编译器把它变成了什么:它创建一个内部类(一个状态机),RightAndLeft 返回这个类的一个实例。 tryroslyn.azurewebsites.net/…
  • @Lankymart 这是很多的语法糖。这家伙总是把事情解释得很好:youtube.com/…
  • 是的。对于我们这些在它之前的日子里编码的人来说,Yield 在某种程度上是一个相当大的改变,但是......它是一种处理它的可爱方式

标签: c# yield-return


【解决方案1】:

编译器将此代码转换为枚举器。你可以使用这个枚举器来遍历序列{1, -1}

foreach(var i in ClassName.RightAndLeft)
    Console.WriteLine(i);

结果

1
-1

请注意,此属性有两个返回语句和返回类型int。它返回一个IEnumerable&lt;int&gt;,一个包含1-1 的序列。

更多信息请参见yield keyword

需要注意的一个重要部分是第二行yield return -1; 在此示例中第一个值已被Console.WriteLine 打印出来之后执行。


由于发帖者是游戏开发者,他可能会使用这两个值作为方向指示符,并且这个枚举可以枚举所有可能的方向或类似的东西。

【讨论】:

  • 一个属性怎么会有两个return语句,yield允许你这样做吗?
  • @Lankymart yield 告诉编译器从这段代码中构建一个枚举器。该属性的返回类型是not int,它是IEnumerable&lt;int&gt;。我添加了一个对yield 作品的解释的链接。
  • 谢谢@RenéVogt 我现在对它在做什么更清楚了。
  • 奇怪,有人决定在 6 月 12 日 17:00 否决问题和您的答案。注意到该问题已被标记为关闭,但已无效。老实说,这些年来我在Stack Overflow 上看到了更糟糕的问题。不过,没有否决另一个答案……你站在别人的一边吗? ;)
【解决方案2】:

它返回包含1-1IEnumerable&lt;int&gt; 对象。

https://msdn.microsoft.com/en-us/library/9k7k7cf0.aspx

【讨论】:

  • 它并没有真正包含它们。不过,它可以在被问到时产生它们。
猜你喜欢
  • 1970-01-01
  • 2013-02-13
  • 2018-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-24
  • 2012-11-06
  • 2018-09-05
相关资源
最近更新 更多