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行,循环下去