閑來無事,翻了翻以前的代碼,做點總結,菜鳥從這裡起航,呵呵。
先上代碼段[1]:
這是我們經常用的,簡單明了,這裡就不贅述了。
接着我就産生了疑問,List具有怎樣的特性才使得foreach可以對它進行周遊呢?這個周遊是如何實作的?
下面就來淺究,再上代碼段[2]:
通過查閱我們發現LIst是通過實作System.Collections.IEnumerable接口來達到可以被周遊的能力,而實作System.Collections.IEnumerable接口必須實作它裡面的GetEnumerator()方法,用來傳回一個循環通路集合的枚舉器,代碼段[2]中就有我對GetEnumerator()方法的實作,其中有個關鍵字[yield]不知大家注意到沒。
我的了解是:與其說是foreach周遊List,不如說是foreach周遊的是List中的GetEnumerator()方法傳回的枚舉器,注意這個枚舉器實作了IEnumerator 接口,(插句話,IEnumerable接口辨別某個類具備被周遊的能力,而IEnumerator 接口則使某個類真正具備這個能力!)。而當foreach對List進行循環周遊時,每個循環就是通過[yield]來分隔的。
通過标題二,我們大概對List進行了了解,但不清楚,下面看看foreach。
依舊代碼段[3]:
就像上面說的,foreach其實周遊的是List中的GetEnumerator()方法傳回的枚舉器enumertor,而這個枚舉器所實作的接口IEnumerator中定義了隻讀的Current屬性(用來擷取枚舉器目前的所指的集合中的元素)、MoveNext方法(将枚舉器推進到集合中的下一個元素,傳回值代表是否到了集合末尾)、Reset方法(使枚舉器指到集合第一個元素之前,也就是重置枚舉器),明白了這些,我們就可以像代碼段[3]中一樣通過[while]文法來實作跟foreach一樣的功能了,而上文中的[yield]關鍵字淺顯的了解就是用來劃分要周遊的集合中的每個元素的。
最後,本來還想分析分析這個實作了IEnumerator接口的枚舉器是怎麼生成的,想象一下它的内部實作,應該很有意思!
就這樣吧,下班了,大家共勉!