C#中yield return用法剖析。本站提示廣大學習愛好者:(C#中yield return用法剖析)文章只能為提供參考,不一定能成為您想要的結果。以下是C#中yield return用法剖析正文
本文實例講述了C#中yield return用法,而且比較了應用yield return與不應用yield return的情形,以便讀者更好的停止懂得。詳細以下:
yield症結字用於遍歷輪回中,yield return用於前往IEnumerable<T>,yield break用於終止輪回遍歷。
有如許的一個int類型的聚集:
static List<int> GetInitialData() { return new List<int>(){1,2,3,4}; }
須要打印出一切值年夜於2的元素。
不應用yield return的完成
static IEnumerable<int> FilterWithoutYield() { List<int> result = new List<int>(); foreach (int i in GetInitialData()) { if (i > 2) { result.Add(i); } } return result; }
客戶端挪用:
static void Main(string[] args) { foreach (var item in FilterWithoutYield()) { Console.WriteLine(item); } Console.ReadKey(); }
輸入成果:3,4
應用yeild return完成
static IEnumerable<int> FilterWithYield() { foreach (int i in GetInitialData()) { if (i > 2) { yield return i; } } yield break; Console.WriteLine("這裡的代碼不履行"); }
客戶端挪用:
static void Main(string[] args) { foreach (var item in FilterWithYield()) { Console.WriteLine(item); } Console.ReadKey(); }
輸入成果:3,4
總結:
經由過程單步驟試發明:
固然2種辦法的輸入成果是一樣的,但運作進程迥然分歧。第一種辦法,是把成果集全體加載到內存中再遍歷;第二種辦法,客戶端每挪用一次,yield return就前往一個值給客戶端,是"按需供應"。
第一種辦法,客戶端挪用進程年夜致為:
應用yield return,客戶端挪用進程年夜致為:
應用yield return為何能包管每次輪回遍歷的時刻早年一次停滯的處所開端履行呢?
--由於,編譯器會生成一個狀況機來保護迭代器的狀況。
簡略地說,當願望獲得一個IEnumerable<T>類型的聚集,而不想把數據一次性加載到內存,便可以斟酌應用yield return完成"按需供應"。
願望本文所述對年夜家的C#法式設計有所贊助。