yield return 1

yield return 数字,并不是代表多少帧之后执行。

yield return的作用是在执行到这行代码之后,将控制权立即交还给外部。yield return之后的代码会在外部代码再次调用MoveNext时才会执行,直到下一个yield return——或是迭代结束。

foreach每次遍历用的 MoveNext(请结合下边代码,看完回答问题,都正确了,说明真的理解了)

 1 using System;
 2 using System.Collections.Generic;
 3 
 4 namespace StudyCSharp
 5 {
 6     class Program
 7     {
 8         public static IEnumerable<int> GenerateFibonacci()
 9         {
10             Console.WriteLine("1111");
11             yield return 0;
12             Console.WriteLine("2222");
13             yield return 1;
14             int last0 = 0, last1 = 1, current;
15             while (true)
16             {
17                 current = last0 + last1;
18                 yield return current;
19                 last0 = last1;
20                 last1 = current;
21             }
22         }
23         static void Main(string[] args)
24         {
25             var temp = GenerateFibonacci();
26             int nCnt = 0;
27             foreach (var item in temp)
28             {
29                 nCnt += item;
30             }
31             Console.WriteLine(nCnt);
32             Console.WriteLine("Hello World!");
33         }
34     }
35 }

问题:

1.是死循环吗

2.打印是什么

3.执行顺序是什么?

答案:

前两个不说了,运行下就知道。第三个,执行25行时,并没有进入函数,控制权交给外部,当调用foreach时,由于内部是MoveNext,执行了10、11行,之后的代码会在外部代码再次调用MoveNext时才会执行,所以,继续执行29行,12、13行、29行、14-18行、29行、19、20、17、18行、29行,循环下去

 
posted @ 2021-06-29 11:09  菜鸡徐思  阅读(254)  评论(0)    收藏  举报