C#枚举器接口IEnumerator的实现

C#枚举器接口IEnumerator的实现

原文(http://blog.****.net/phpxin123/article/details/7897226)

   在C#中,如果一个类要使用foreach结构来实现迭代,就必须实现IEnumerable或IEnumerator接口。其中,IEnumerator接口定义了实现枚举器模式的方法IEnumerator.MoveNext()和IEnumerator.Reset()和成员属性IEnumerator.Count,而IEnumerable接口的唯一方法IEnumerable.GetEnumerator()仅用来返回一个IEnumerator对象,用来间接实现一个IEnumerator接口。

    而泛型的IEnumerator<T>和IEnumerable<T>接口与普通类型的相似,它们是普通类型枚举器接口的泛化形式。但实现IEnumerable<T>接口,需要实现两个GetEnumerator,分别为IEnumerator IEnumerable.GetEnumerator()和IEnumerator<T> GetEnumerator()。

    1、IEnumerator的实现

        自己找例子看.....

    2、IEnumerable的实现

     (1)返回一个IEnumerator

            自己找例子看.....

     (2)使用yield return(yield break)语法

           自己找例子看看.....

    3、一种混合实现的结构

       在一个类(如ClassName1)中实现IEnumerable接口,而在另一个类(如ClassName1Enumerator)中实现IEnumerator接口,并在ClassName1中的GetEnumerator()方法中,返回一个用ClassName1实例化的ClassName1Enumerator对象。

     4、枚举器具体介绍 

       枚举器可用于读取集合中的数据,但不能用于修改基础集合。

因此,在读取Current 的值之前,必须先通过调用MoveNext 方法将枚举器前移到集合中的第一个元素。

MoveNext 将Current 设置到下一个元素。

若要再次将Current 设置为集合的第一个元素,可以调用Reset,然后再调用MoveNext

如果在MoveNext 和Current 之间修改了集合,则Current 会返回已将它设置为的元素,即使该枚举数已失效。

若要确保枚举过程中的线程安全性,可以在整个枚举期间锁定集合,或者捕获由其他线程进行的更改所导致的异常。