国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

C#yieldreturn用法與解析

2019-11-14 13:42:44
字體:
來源:轉載
供稿:網友

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實現"按需供給"。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 津市市| 资中县| 丹东市| 于田县| 民丰县| 诸城市| 青铜峡市| 平安县| 景东| 霍邱县| 桦川县| 房产| 松阳县| 通榆县| 会泽县| 江阴市| 兴业县| 客服| 邮箱| 陆良县| 大姚县| 屏东市| 宁波市| 尉氏县| 阳春市| 肥乡县| 惠安县| 平顺县| 翼城县| 山西省| 和田市| 延川县| 桂东县| 长顺县| 衡阳市| 阿拉善盟| 长兴县| 怀化市| 林西县| 六安市| 宜州市|