最近翻看了之前的學習筆記,看到foreach,記得當時老師講的時候,有點犯渾,不是很明白,這好比,上國小時,你不會乘法口訣,但是随着時間的增長,你不自覺的都會了,也悟出個小道理,有些東西,你當時不太懂,但随着你的閱曆和經驗的增長,有那麼一天你會恍然大悟,哦,原來是這樣。
提到foreach就不得不說集合,那麼就先從自定義的集合開始吧。
<a></a>
不知道自定義的集合和ArrayList是否一樣,可以簡單的測試一下。
此時是.Net中的ArrayList,結果:
自定義的集合,結果:
輸出結果一樣,那麼現在用foreach周遊,自定義集合中的元素。F6編譯,會提示錯誤。
其實foreach是怎樣工作的呢?
衆所周知foreach中in後面的對象應該是實作IEnumerable接口的,程式運作時本質是在調用IEnumerable的GetEnumerator函數來傳回一個IEnumerator對象,foreach就是利用IEnumerator對象的Current,MoveNext和Reset成員來進行一段資料的枚舉。簡單的代碼實作如下:
将這個代碼放在自定義集合中,定義一個方法GetArray(),然後測試一下
測試結果:
你運作會發現多出很多逗号,原因是執行後,enumerator沒有被Dispose掉,而繼承IDisposable的疊代器(IEnumerator)在foreach結束後會被正确處理掉(調用Dispose方法)。
實作IEnumerable接口必須實作它裡面的成員GetEnumerator()方法:
該方法的傳回值為實作了IEnumerator接口的類的對象。那麼現在需要定義一個實作了該接口的類。
疊代需要數組參數,在構造函數中将自定義集合中的數組傳進來,并且在MoveNext中需要判斷指針是否移動到數組的末尾,那麼需要數組的長度。
MyArrayList中GetEnumerator()方法實作
MyEnumerator類
測試,foreach語句,然後編譯不再報錯,說明已經成功了,結果如下:
這次後邊不會多出逗号,原因實作了疊代器接口而疊代器繼承自IDisposable接口,最後調用了Dispose()方法
foreach周遊in後面的對象需實作IEnumerable接口。
東西比較基礎,以上是個人了解,如了解有誤,請指正,以免誤人子弟。
部落格位址:
<a href="http://www.cnblogs.com/wolf-sun">http://www.cnblogs.com/wolf-sun/</a>
部落格版權:
本文以學習、研究和分享為主,歡迎轉載,但必須在文章頁面明顯位置給出原文連接配接。
如果文中有不妥或者錯誤的地方還望高手的你指出,以免誤人子弟。如果覺得本文對你有所幫助不如【推薦】一下!如果你有更好的建議,不如留言一起讨論,共同進步!
再次感謝您耐心的讀完本篇文章。
轉載:http://www.cnblogs.com/wolf-sun/p/3549968.html