程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C# yield return 用法與解析,

C# yield return 用法與解析,

編輯:C#入門知識

C# yield return 用法與解析,


C# yield return 用法與解析

本文參考自:http://www.jb51.net/article/54810.htm

 

 當初沒有認真理解 yield 這個關鍵字,現在又遇到了依舊不理解,為了以後不再為了 yield 困惑,決定好好研究一下 yield 的用法與意義:

yield 從字面上理解有“退位,屈服”的意思,轉一下彎就理解成“權限轉移”,也就是將控制權交給別人,在這裡就是把集合裡滿足條件(如果沒有過濾條件,就是全體)的個體的操作轉移給另一個對象。

    class Program
    {
        static void Main(string[] args)
        {
            foreach (var item in FilterWithoutYield)
            {
                Console.WriteLine(item);
            }
            Console.ReadKey(); 
        }


        //申明屬性,定義數據來源
        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;
                }
            }
        }

為什麼會這樣呢?

通過單步調試發現:

雖然2種方法的輸出結果是一樣的,但運作過程迥然不同。第一種方法,是把結果集全部加載到內存中再遍歷;第二種方法,客戶端每調用一次,yield return就返回一個值給客戶端,是"按需供給"。

第一種方法,客戶端調用過程大致為:

使用yield return,客戶端調用過程大致為:

 

使用yield return為什麼能保證每次循環遍歷的時候從前一次停止的地方開始執行呢?

--因為,編譯器會生成一個狀態機來維護迭代器的狀態。

簡單地說,當希望獲取一個IEnumerable<T>類型的集合,而不想把數據一次性加載到內存,就可以考慮使用yield return實現"按需供給"。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved