Enumerator 迭代器,它是一个作用于一系列值的只读的只能向前的游标。enumerator对象需要实现下列接口中的一个:


  • System.Collections.IEnumerator
  • System.Collections.Generic.IEnumerator<T>


foreach语句会迭代一个Enumerable对象,enumerable对象是一个序列的逻辑表述。它本身不是游标,但是它产生游标。如果一个对象是enumerable对象,那么需要满足下列条件的一个:


  • 实现了IEnumerable和IEnumerable<T>接口
  • 有一个GetEnumerator方法,它返回一个enumerator 迭代器。


下面看两个迭代的例子。第一个是相对高级的方式,使用foreach:


foreach (char c in "Hello World")  {       Console.WriteLine(c);  }




而相对低级的方式,就是不使用foreach:


using (var enumerator = "Hello World".GetEnumerator())  {          while (enumerator.MoveNext())          {                var element=enumerator.Current;                Console.WriteLine(element);          }   }



注意:如果enumerator实现了IDisposable接口,那么foreach语句也会像using一样,在结束的时候隐式的dispose掉enumerator 对象。