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。产量是句法糖的一种形式。