C#中的枚举器(enumerator)通俗的讲是一个可以递进式的访问一个序列的指针(可能这并不恰当)。foreach语句(迭代语句)是我们比较熟悉的,例如顺序输入一个字符串中的每个字符:
foreach (char c in "foreach")
{
Console.WriteLine(c);
}
在这里foreach迭代的是一个字符串,这里的字符串便是一个可枚举的对象,那么什么又是可枚举对象呢?可枚举对象实际上是一个可以返回一个枚举器的对象。这里似乎有点绕,可能明确一下枚举器和可枚举对象的定义,会更容易理解。在C#中,一个对象只要实现IEnumerator或IEnumerator<T>接口,那么这个对象就是一个枚举器。IEnumerator的定义是:
public interface IEnumerator
{
bool MoveNext();//用于迭代的方法
object Current { get; }//用于获取当前元素的属性
void Reset();//重置
}
IEnumerator<T>的定义是:
public interface IEnumerator<T> : IDisposable, IEnumerator
{
T Current { get; }
}
在IEnumerator接口中定义了一个用于迭代的方法,和一个用于获取当前元素的属性。
可枚举对象是一个实现了IEnumerable或IEnumerable<T>的对象,他们的定义分别是:
public interface IEnumerable
{
IEnumerator GetEnumerator();
}
public interface IEnumerable<T> : IEnumerable
{
IEnumerator<T> GetEnumerator();
}
foreach为我们操作可枚举对象提供了方便,如果没有foreach我们可能需要这样去迭代一个对象:
CharEnumerator charEnumeartor = "foreach".GetEnumerator();
while (charEnumeartor.MoveNext())
{
char c = charEnumeartor.Current;
Console.WriteLine(c);
}
看起来很麻烦,哈哈。
可枚举对象接口中的GetEnumerator方法是用于返回一个枚举器的,可能是出于解偶和灵活性的考虑,如果把IEnumerator和IEnumerable合并到一起,我们理解可枚举对象可能会更容易,即一个枚举器又是一个可枚举对象,其实迭代器就是用于生成一个即是枚举器又是可枚举对象的。 (待续……)。