关于asp.net:如何在c#中工作

How yield works in c#

本问题已经有最佳答案,请猛点这里访问。

我在使用产量,在某个地方,有人能解释产量是如何工作的吗?我的场景如下所示。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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);
    }
}

所以我们得到的结果是

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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转移到可枚举方法。为什么不调用整个方法,而只在每次执行循环时调用。


yield return语句在语义上等同于一个返回语句(它将控制流传递给调用方法),在foreach循环的下一个迭代中,后面跟一个"goto"到yield语句。

1
2
Return
Goto

公共语言运行库中不存在此行为。它由C编译器生成的类实现。然后由clr执行并编译jit。产量是句法糖的一种形式。