真会C#? -- Enumerator, Enumerable
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 对象。