何时调用IEnumerator.Reset()方法?

Far*_*ine 9 c# interface

让我们有这个代码:

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.或者更好的避免具有读了两遍,因为不是所有的数据是重复的.

  • 您是否有链接到它说应该抛出异常的地方?我想详细了解一下。 (2认同)

sup*_*cat 8

IEnumerable和IEnumerator通常应该是单独的类,除了总是返回空的枚举器或总是返回相同的项之外,GetEnumerator方法必须始终返回IEnumerator的新实例.

IEnumerator.Reset没有多大意义; for-each循环不使用它,并且IEnumerable/IEnumerator的使用者不能使用它,除非他们知道可枚举类型是什么,在这种情况下他们可以使用实际类型而不是接口.