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#法式設計有所贊助。