【问题标题】:How yield works in c# [duplicate]产量如何在c#中工作[重复]
【发布时间】:2013-01-29 00:22:51
【问题描述】:

我正在使用 yield 并在某处被击中,任何人都可以解释 yield 的工作原理 我的场景如下所示。

public static IEnumerable Power(int number, int exponent)
{
    int result = 1;
    int counter = 0;
    Console.WriteLine("Inside Power - Before While");
    while (counter++ < exponent)
    {
        Console.WriteLine("Inside Power - Inside While");
        result = result * number;
        yield return result;
        //Console.WriteLine("New line added");
    }
    Console.WriteLine("Inside Power - After While"); 
}

static void Main(string[] args)
{
    foreach (int i in Power(2, 8))
    {
        Console.WriteLine("{0}", i);
    }
}

所以我们在这里得到的输出是

Inside Power - Before While
Inside power - Inside While
2
Inside power - Inside While
4
Inside power - Inside While
8
Inside power - Inside While
16
Inside power - Inside While
32
Inside power - Inside While
64
Inside power - Inside While
128
Inside power - Inside While
256
Inside power - AfterWhile

所以我的问题是指针如何从 foreach 转移到 Enumerable 方法 while 循环和打印等等。 为什么不调用整个方法,每次只执行while循环。

【问题讨论】:

  • 有关此主题的非常详细的讨论,请阅读this blog post
  • 您可以将收益视为“延续”。当您产生一个值时,参与者可以获得该值,下次您请求一个值时,它会回到它在产生函数中停止的位置并继续,就好像它从未离开过函数一样。
  • Thanx,我已经阅读了那篇文章,但我想知道那个输出。不过谢谢了解里面的流程

标签: asp.net c#-4.0


【解决方案1】:

yield return 语句在语义上等同于 return 语句(将控制流传递给调用方法),然后在 foreach 循环的下一次迭代中对 yield 语句进行“goto”。

Return
Goto

公共语言运行时中不存在此行为。它由 C# 编译器生成的类实现。然后由 CLR 执行和 JIT 编译。 Yield 是一种语法糖。

【讨论】:

    猜你喜欢
    • 2017-12-20
    • 2012-11-11
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 2011-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多