using System; using System.Collections.Generic; using System.Linq; using System.Text; using UnityEngine; public class TestYield : MonoBehaviour { static IEnumerable WithNoYield() { IList list = new List(); for (int i = 0; i < 20; i++) { LogHelper.Log("WithNoYield Quary " + i.ToString()); if (i > 2) list.Add(i); } return list; } static IEnumerable WithYield() { for (int i = 0; i < 20; i++) { LogHelper.Log("WithYield Quary " + i.ToString()); if (i > 2) yield return i; } } void Start() { LogHelper.Log("------------------ WithNoYield--------------"); WithNoYield(); LogHelper.Log("------------------WithYield--------------"); // 直接调用yield封装的函数不会被执行,会延迟计算 WithYield(); WithYield(); WithYield(); WithYield(); WithYield(); WithYield(); // 执行一次会将控制权从函数里面交出,给外部,如果外部是异步的或者子线程一直循环的被挂起了 // 下次再重入该函数,那么该yield函数的调用堆栈状态会被保留,从而接着上次状态继续执行 LogHelper.Log("------------------ foreach WithNoYield--------------"); foreach (int i in WithNoYield()) { LogHelper.Log("Result " + i.ToString()); } // 如果yield迭代器全部执行完了,再重新进来不会保留堆栈信息 LogHelper.Log("------------------ foreach WithYield1--------------"); foreach (int i in WithYield()) { Console.WriteLine("Result " + i.ToString()); if (i == 10) { break; } } LogHelper.Log("------------------ foreach WithYield2-------------"); foreach (int i in WithYield()) { LogHelper.Log("Result " + i.ToString()); } LogHelper.Log("-----------------------------------------"); } }