在学习C#过程的时候,经常看到IEumerator接口,但是就是没有引起足够的重视,今天用NETReflector工具看到些源代码,发觉这个IEumerator这是接口无处不在。其实 IEumerator是所用非泛型枚举数的基接口,Array,list,dictionary,set等等都继承了这个接口。

对于这个接口的使用,最常用的就是foreach语句,在程序中我们经常需要遍历一个collection里面的元素,并且和喜欢用到var类型,这样就不需要明确collection里面的元素类型。枚举数就是遍历集合里面的元素,而不用修改集合的元素。

     IEumerator里面包含连个方法MoveNext和Reset,一个属性Current,调用Reset直接返回到集合第一个元素的前一个位置,而MoveNext则指向下一个元素。调用属性Current只是返回当前指针所指向的值,如果在调用Reset之后调用Current,则会出现异常。当MoveNext移到集合的最后一个元素的下一个元素之后会返回false。

     枚举数对集合没有独占权,因此枚举集合过程从头到尾都不是一个线程安全的过程,即使某个集合已同步,其他线程仍然可以修改集合里面的元素。若要保证在线程安全条件下访问集合,必须锁住集合,或者捕获其他线程进行的更改而应发的异常。