This question already has answers here:
What is the difference between IEnumerator and IEnumerable? [duplicate]

(4个答案)


已关闭6年。




我正在为我的C#考试做准备。
我对这个问题的答案感到困惑:



我的答案是 b )。但是这本书:MCSD认证工具包说这是)。

有人可以告诉我为什么吗?我意识到您可以使用Enumerator获取GetEnumerator(),然后调用MoveNextReset方法在列表中移动(并使用Current访问迭代器引用的当前元素)。但是实现IEnumerableIEnumerator难道不是在foreach循环中使用对象的原因吗?

最佳答案

正确的答案是,如果您看一下接口(interface)的定义,这一点很清楚:

[GuidAttribute("496B0ABE-CDEE-11d3-88E8-00902754C43A")]
[ComVisibleAttribute(true)]
public interface IEnumerable
{
    IEnumerator GetEnumerator();
}


[ComVisibleAttribute(true)]
[GuidAttribute("496B0ABF-CDEE-11d3-88E8-00902754C43A")]
public interface IEnumerator
{
    Object Current { get; }
    bool MoveNext();
    void Reset();
}

如您在这里注意到的,当一个类型实现IEnumerable接口(interface)时,它应该具有一个将返回Enumerator的方法,该对象是一个实现IEnumerator接口(interface)的对象。

然后,当我们遍历一个集合时,称为IEnumerator的接口(interface)具有一个保存当前对象的属性,以及两种方法,MoveNextReset。在幕后,当我们遍历一个集合时,首先会调用名为MoveNext的Iterator方法。如果是这样,我们得到第一个元素-这是当前对象。然后,一次又一次调用名为MoveNext的方法,直到返回false。每次调用MoveNext时,我们都会从集合中获取一个对象,然后进行迭代。

为什么我们有Reset方法?

正如MSDN中所述:

关于c# - 实现IEnumerable和IEnumerator的原因是什么,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24891645/

10-10 23:48