溫故而知新,可以為師矣,有空經常複習一下基礎知識是有必要的,并且能加深了解和記憶。
Foreach常用于循環通路集合,對實作IEnumerable的接口的容器進行周遊,IEnumerable和IEnumerator接口我有時候也有點迷糊,按官方的解釋,IEnumerable是枚舉器接口,IEnumerator是疊代器接口,從字面意思來看相差不大,逐一分析一下。
IEnumerable接口
繼承IEnumerable接口的類需實作暴露出來的GetEnumerator()方法,并傳回一個IEnumerator接口對象,看來真正做事的是IEnumerator,F12看一下IEnumerator又有什麼鬼東西。
IEnumerator接口
IEnumerator接口有三個東東,一個屬性Current,傳回目前集合中的元素,方法MoveNext()移動到下一個,周遊不都是向後周遊的嘛,Reset(),字面意思重置,這個容易了解。做個假設:既然IEnumerable接口傳回是IEnumerator接口疊代器來實作的,那麼僅繼承IEnumerator疊代器接口能不能實作一個自定義容器?
定義一個Phone類
定義一個名為MyEnumerator疊代器,并現實它接口IEnumerator
結果顯示:
果然不出所料,真正做事情的是IEnumerator接口,即可循環通路自定義的一個容器,不過,初衷是想用Foreach來做循環通路、周遊的。那好,那就隻能顯示IEnumerable接口來做。稍稍改造一下Phone類:
大功告成,再擴充成通用的容器PhonePackage,繼承泛型IEnumerable<T>接口即可。
IEnumerator疊代器接口挺啰嗦的,yield是簡化了周遊的文法糖而已。
參考List<T>源碼:http://www.projky.com/dotnet/4.5.1/System/Collections/Generic/List.cs.html
作者:EminemJK(山治先生)
出處:https://www.cnblogs.com/EminemJK/
您的支援是對部落客最大的鼓勵👍,感謝您的認真閱讀。
本文版權歸作者所有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。