天天看點

C# IEnumerable 和 IEnumerator接口淺析

  溫故而知新,可以為師矣,有空經常複習一下基礎知識是有必要的,并且能加深了解和記憶。

  Foreach常用于循環通路集合,對實作IEnumerable的接口的容器進行周遊,IEnumerable和IEnumerator接口我有時候也有點迷糊,按官方的解釋,IEnumerable是枚舉器接口,IEnumerator是疊代器接口,從字面意思來看相差不大,逐一分析一下。

IEnumerable接口

  繼承IEnumerable接口的類需實作暴露出來的GetEnumerator()方法,并傳回一個IEnumerator接口對象,看來真正做事的是IEnumerator,F12看一下IEnumerator又有什麼鬼東西。

IEnumerator接口

  IEnumerator接口有三個東東,一個屬性Current,傳回目前集合中的元素,方法MoveNext()移動到下一個,周遊不都是向後周遊的嘛,Reset(),字面意思重置,這個容易了解。做個假設:既然IEnumerable接口傳回是IEnumerator接口疊代器來實作的,那麼僅繼承IEnumerator疊代器接口能不能實作一個自定義容器?

定義一個Phone類

  定義一個名為MyEnumerator疊代器,并現實它接口IEnumerator

結果顯示:

C# IEnumerable 和 IEnumerator接口淺析

  果然不出所料,真正做事情的是IEnumerator接口,即可循環通路自定義的一個容器,不過,初衷是想用Foreach來做循環通路、周遊的。那好,那就隻能顯示IEnumerable接口來做。稍稍改造一下Phone類:

C# IEnumerable 和 IEnumerator接口淺析

  大功告成,再擴充成通用的容器PhonePackage,繼承泛型IEnumerable<T>接口即可。

C# IEnumerable 和 IEnumerator接口淺析

  IEnumerator疊代器接口挺啰嗦的,yield是簡化了周遊的文法糖而已。

參考List<T>源碼:http://www.projky.com/dotnet/4.5.1/System/Collections/Generic/List.cs.html

作者:EminemJK(山治先生)

出處:https://www.cnblogs.com/EminemJK/

您的支援是對部落客最大的鼓勵👍,感謝您的認真閱讀。

本文版權歸作者所有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。

C# IEnumerable 和 IEnumerator接口淺析
c#