說明:yield關鍵字用于遍歷循環中,yield return用于返回IEnumerable<T>,yield break用于終止循環遍歷。
以下對比了使用yield return與不使用yield return的情況,直接上代碼:
using System;using System.Collections.Generic;namespace ConsoleApp{ class PRogram { static void Main(string[] args) { Console.WriteLine("不使用 yield return 方式的結果"); foreach (var item in WithoutYield()) { Console.WriteLine(item); } Console.WriteLine("使用 yield return 方式的結果"); foreach (var item in WithYield()) { Console.WriteLine(item); } Console.ReadLine(); } /// <summary> /// 不使用 yield return /// </summary> /// <returns></returns> static IEnumerable<int> WithoutYield() { List<int> result = new List<int>(); foreach (int i in GetData()) { if (i > 2) { result.Add(i); } } return result; } /// <summary> /// 使用 yield return /// </summary> /// <returns></returns> static IEnumerable<int> WithYield() { foreach (int i in GetData()) { if (i > 2) { yield return i; } } yield break; Console.WriteLine("這里的代碼不執行"); } /// <summary> /// 獲取數據 /// </summary> /// <returns></returns> static List<int> GetData() { return new List<int>() { 1, 2, 3, 4 }; } }}
輸出結果如下:
總結:
通過調試發現:兩種方法的輸出結果是一樣的,但實際的運作過程是不同的。
第一種方法,是把結果集全部加載到內存中再遍歷;
第二種方法,遍歷每調用一次,yield return就返回一個值;
因此,當希望獲取一個IEnumerable<T>類型的集合,而不想把數據一次性加載到內存,就可以考慮使用yield return的方式去實現;
新聞熱點
疑難解答