C# yield return 用法與解析
本文參考自:http://www.jb51.net/article/54810.htm
當(dāng)初沒有認真理解 yield 這個關(guān)鍵字,現(xiàn)在又遇到了依舊不理解,為了以后不再為了 yield 困惑,決定好好研究一下 yield 的用法與意義:
yield 從字面上理解有“退位,屈服”的意思,轉(zhuǎn)一下彎就理解成“權(quán)限轉(zhuǎn)移”,也就是將控制權(quán)交給別人,在這里就是把集合里滿足條件(如果沒有過濾條件,就是全體)的個體的操作轉(zhuǎn)移給另一個對象。
class PRogram { static void Main(string[] args) { foreach (var item in FilterWithoutYield) { Console.WriteLine(item); } Console.ReadKey(); } //申明屬性,定義數(shù)據(jù)來源 public static List<int> Data { get { return new List<int>(){1,2,3,4,5,6,7,8}; } } //申明屬性,過濾器(不適用yield) public static IEnumerable<int> FilterWithoutYield { get { var result = new List<int>(); foreach (var i in Data) { if (i > 4) result.Add(i); } return result; } } }
可以看到如果不用yield,要返回大于4的所有的樹,就要到另一個集合。而用yield的情況下就不必如此麻煩了:
//申明屬性,過濾器(使用yield) public static IEnumerable<int> FilterWithoutYield { get { foreach (var i in Data) { if (i > 4) yield return i; } } }
為什么會這樣呢?
通過單步調(diào)試發(fā)現(xiàn):
雖然2種方法的輸出結(jié)果是一樣的,但運作過程迥然不同。第一種方法,是把結(jié)果集全部加載到內(nèi)存中再遍歷;第二種方法,客戶端每調(diào)用一次,yield return就返回一個值給客戶端,是"按需供給"。
第一種方法,客戶端調(diào)用過程大致為:
使用yield return,客戶端調(diào)用過程大致為:
使用yield return為什么能保證每次循環(huán)遍歷的時候從前一次停止的地方開始執(zhí)行呢?
--因為,編譯器會生成一個狀態(tài)機來維護迭代器的狀態(tài)。
簡單地說,當(dāng)希望獲取一個IEnumerable<T>類型的集合,而不想把數(shù)據(jù)一次性加載到內(nèi)存,就可以考慮使用yield return實現(xiàn)"按需供給"。
|
新聞熱點
疑難解答