让我们有这个代码:
class MyList : IEnumerable, IEnumerator
{
int[] A = { 1, 2, 3, 4, 5 };
int i = -1;
#region IEnumerator Members
public object Current
{
get { return A[i]; }
}
public bool MoveNext()
{
i++;
return i < 5;
}
public void Reset()
{
i = -1;
}
#endregion
#region IEnumerable Members
public IEnumerator GetEnumerator()
{
return (IEnumerator)this;
}
#endregion
}
Run Code Online (Sandbox Code Playgroud)
并在主要方法:
MyList list = new MyList();
foreach (int i in list)
{
Console.WriteLine(i);
}
foreach (int i in list)
{
Console.WriteLine(i);
}
Run Code Online (Sandbox Code Playgroud)
为什么第二个foerach不起作用?并且"i"不会再次初始化?
是这样的:在执行foreach之前应该自动调用Reset方法吗?
为什么不打电话?
Mar*_*ell 10
重置是多余的; 因此,迭代器块的语言规范要求在Reset上抛出异常.正确的做法是简单地处理和释放旧的迭代器,然后再次调用GetEnumerator.或者更好的避免具有读了两遍,因为不是所有的数据是重复的.
IEnumerable和IEnumerator通常应该是单独的类,除了总是返回空的枚举器或总是返回相同的项之外,GetEnumerator方法必须始终返回IEnumerator的新实例.
IEnumerator.Reset没有多大意义; for-each循环不使用它,并且IEnumerable/IEnumerator的使用者不能使用它,除非他们知道可枚举类型是什么,在这种情况下他们可以使用实际类型而不是接口.