C#中yield return用法分析
本文實(shí)例講述了C#中yield return用法,并且對(duì)比了使用yield return與不使用yield return的情況,以便讀者更好的進(jìn)行理解。具體如下:
yield關(guān)鍵字用于遍歷循環(huán)中,yield return用于返回IEnumerable<T>,yield break用于終止循環(huán)遍歷。
有這樣的一個(gè)int類型的集合:
static List<int> GetInitialData() { return new List<int>(){1,2,3,4}; }
需要打印出所有值大于2的元素。
不使用yield return的實(shí)現(xiàn)
static IEnumerable<int> FilterWithoutYield() { List<int> result = new List<int>(); foreach (int i in GetInitialData()) { if (i > 2) { result.Add(i); } } return result; }
客戶端調(diào)用:
static void Main(string[] args) { foreach (var item in FilterWithoutYield()) { Console.WriteLine(item); } Console.ReadKey(); }
輸出結(jié)果:3,4
使用yeild return實(shí)現(xiàn)
static IEnumerable<int> FilterWithYield() { foreach (int i in GetInitialData()) { if (i > 2) { yield return i; } } yield break; Console.WriteLine("這里的代碼不執(zhí)行"); }
客戶端調(diào)用:
static void Main(string[] args) { foreach (var item in FilterWithYield()) { Console.WriteLine(item); } Console.ReadKey(); }
輸出結(jié)果:3,4
總結(jié):
通過單步調(diào)試發(fā)現(xiàn):
雖然2種方法的輸出結(jié)果是一樣的,但運(yùn)作過程迥然不同。第一種方法,是把結(jié)果集全部加載到內(nèi)存中再遍歷;第二種方法,客戶端每調(diào)用一次,yield return就返回一個(gè)值給客戶端,是"按需供給"。
第一種方法,客戶端調(diào)用過程大致為:
使用yield return,客戶端調(diào)用過程大致為:
使用yield return為什么能保證每次循環(huán)遍歷的時(shí)候從前一次停止的地方開始執(zhí)行呢?
--因?yàn)?,編譯器會(huì)生成一個(gè)狀態(tài)機(jī)來維護(hù)迭代器的狀態(tài)。
簡單地說,當(dāng)希望獲取一個(gè)IEnumerable<T>類型的集合,而不想把數(shù)據(jù)一次性加載到內(nèi)存,就可以考慮使用yield return實(shí)現(xiàn)"按需供給"。
希望本文所述對(duì)大家的C#程序設(shè)計(jì)有所幫助。
相關(guān)文章
C# .net core HttpClientFactory用法及說明
這篇文章主要介紹了C# .net core HttpClientFactory用法及說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11C#多線程學(xué)習(xí)之(五)使用定時(shí)器進(jìn)行多線程的自動(dòng)管理
這篇文章主要介紹了C#多線程學(xué)習(xí)之使用定時(shí)器進(jìn)行多線程的自動(dòng)管理,實(shí)例分析了C#使用timer定時(shí)器類實(shí)現(xiàn)針對(duì)多線程的自動(dòng)管理功能,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04Win10下C# DateTime出現(xiàn)星期幾問題的解決方法
這篇文章主要介紹了Win10下C# DateTime出現(xiàn)星期幾問題的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-10-10教你創(chuàng)建一個(gè)帶診斷工具的.NET鏡像
本文編寫的初衷是因?yàn)樵谌豪镉泻芏嘈』锇橛龅缴a(chǎn)環(huán)境性能問題的時(shí)候,.NET的runtime鏡像中沒有帶一些工具,安裝和使用起來很麻煩,所以分享一些我們公司內(nèi)部一些技巧,對(duì).NET鏡像帶診斷工具相關(guān)知識(shí)感興趣的朋友一起看看吧2022-07-07