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

首頁(yè) > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

對(duì)[foreach]的淺究到發(fā)現(xiàn)[yield]

2019-11-17 03:06:39
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

對(duì)[foreach]的淺究到發(fā)現(xiàn)[yield]

  閑來(lái)無(wú)事,翻了翻以前的代碼,做點(diǎn)總結(jié),菜鳥從這里起航,呵呵。

一、List的foreach遍歷

  先上代碼段[1]:

 1  class PRogram 2     { 3         static void Main(string[] args) 4         { 5             List<string> dayList = new List<string> { "Sun", "Mon", "Tue", "Wed", "Thr", "Fri", "Sat" }; 6             foreach (var day in dayList) 7             { 8                 Console.WriteLine(day); 9             }10             Console.ReadKey();11         }12     }

  這是我們經(jīng)常用的,簡(jiǎn)單明了,這里就不贅述了。

二、對(duì)List的淺究

  接著我就產(chǎn)生了疑問(wèn),List具有怎樣的特性才使得foreach可以對(duì)它進(jìn)行遍歷呢?這個(gè)遍歷是如何實(shí)現(xiàn)的?

  下面就來(lái)淺究,再上代碼段[2]:

 1     public class DaysList<T> : System.Collections.IEnumerable 2     { 3         T[] daysArry; 4         public DaysList(T[] days) 5         { 6             daysArry = days; 7         } 8         public System.Collections.IEnumerator GetEnumerator() 9         {10             for (int i = 0; i < daysArry.Length; i++)11             {12                 yield return daysArry[i];13             }14         }15     }16 17     class Program18     {19         static void Main(string[] args)20         {21             string[] days = { "Sun", "Mon", "Tue", "Wed", "Thr", "Fri", "Sat" };22             var daysList = new DaysList<string>(days);23 24             foreach (string day in daysList)25             {26                 System.Console.WriteLine(day);27             }28             Console.ReadKey();29         }30     }

  通過(guò)查閱我們發(fā)現(xiàn)LIst是通過(guò)實(shí)現(xiàn)System.Collections.IEnumerable接口來(lái)達(dá)到可以被遍歷的能力,而實(shí)現(xiàn)System.Collections.IEnumerable接口必須實(shí)現(xiàn)它里面的GetEnumerator()方法,用來(lái)返回一個(gè)循環(huán)訪問(wèn)集合的枚舉器,代碼段[2]中就有我對(duì)GetEnumerator()方法的實(shí)現(xiàn),其中有個(gè)關(guān)鍵字[yield]不知大家注意到?jīng)]。

  我的理解是:與其說(shuō)是foreach遍歷List,不如說(shuō)是foreach遍歷的是List中的GetEnumerator()方法返回的枚舉器,注意這個(gè)枚舉器實(shí)現(xiàn)了IEnumerator 接口,(插句話,IEnumerable接口標(biāo)識(shí)某個(gè)類具備被遍歷的能力,而IEnumerator 接口則使某個(gè)類真正具備這個(gè)能力!)。而當(dāng)foreach對(duì)List進(jìn)行循環(huán)遍歷時(shí),每個(gè)循環(huán)就是通過(guò)[yield]來(lái)分隔的。

三、對(duì)foreach的淺究

  通過(guò)標(biāo)題二,我們大概對(duì)List進(jìn)行了了解,但不清楚,下面看看foreach。

  依舊代碼段[3]:

 1     //注意:其中類DaysList<T>的實(shí)現(xiàn)同代碼段[2]一樣 2     //這里只展示foreach的實(shí)現(xiàn)。     3     class Program 4     { 5         static void Main(string[] args) 6         { 7             string[] days = { "Sun", "Mon", "Tue", "Wed", "Thr", "Fri", "Sat" }; 8             var daysList = new DaysList<string>(days); 9 10             System.Collections.IEnumerator enumertor = daysList.GetEnumerator();11             while (enumertor.MoveNext())12             {13                 System.Console.WriteLine(enumertor.Current);14             }15             Console.ReadLine();16         }17      }

  就像上面說(shuō)的,foreach其實(shí)遍歷的是List中的GetEnumerator()方法返回的枚舉器enumertor,而這個(gè)枚舉器所實(shí)現(xiàn)的接口IEnumerator中定義了只讀的Current屬性(用來(lái)獲取枚舉器當(dāng)前的所指的集合中的元素)、MoveNext方法(將枚舉器推進(jìn)到集合中的下一個(gè)元素,返回值代表是否到了集合末尾)、Reset方法(使枚舉器指到集合第一個(gè)元素之前,也就是重置枚舉器),明白了這些,我們就可以像代碼段[3]中一樣通過(guò)[while]語(yǔ)法來(lái)實(shí)現(xiàn)跟foreach一樣的功能了,而上文中的[yield]關(guān)鍵字淺顯的理解就是用來(lái)劃分要遍歷的集合中的每個(gè)元素的。

  最后,本來(lái)還想分析分析這個(gè)實(shí)現(xiàn)了IEnumerator接口的枚舉器是怎么生成的,想象一下它的內(nèi)部實(shí)現(xiàn),應(yīng)該很有意思!

  就這樣吧,下班了,大家共勉!


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 天祝| 合水县| 汉阴县| 汶上县| 石渠县| 莎车县| 东莞市| 长宁县| 灵武市| 呼伦贝尔市| 桦甸市| 长乐市| 梨树县| 论坛| 龙里县| 德钦县| 宝清县| 邯郸市| 呼伦贝尔市| 石棉县| 天水市| 鄂温| 建阳市| 丁青县| 怀安县| 汉寿县| 肥西县| 淮滨县| 武穴市| 永川市| 岗巴县| 吴桥县| 保德县| 河东区| 云林县| 花垣县| 太原市| 韶关市| 遂平县| 监利县| 鄂托克前旗|