我正在为我的C#EXAM做准备。 我对这个问题的答案感到困惑:
程序可以使用
IEnumerable
和IEnumerator
接口来执行以下哪项操作?一个。使用MoveNext和Reset来移动对象列表 湾使用foreach移动对象列表。
C。按索引移动对象列表 d。使用yield return语句来创建迭代对象列表。
我的回答是 b )。但是这本书: MCSD Certification Toolkit 表示它是 a )。
有人可以告诉我为什么吗?我意识到您可以使用Enumerator
获取GetEnumerator()
,然后调用MoveNext
和Reset
方法在列表中移动(并使用Current
访问迭代器引用的当前元素)。但是没有实现IEnumerable
和IEnumerator
在foreach
循环中使用对象的原因吗?
答案 0 :(得分:4)
正确的答案是 a ,如果您查看接口的定义,这一点很清楚:
[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
接口时,它应该有一个返回Enumerator的方法,Enumerator是一个实现IEnumerator
接口的对象。
当我们遍历集合和两个方法IEnumerator
和MoveNext
时,名为Reset
的接口有一个属性来保存当前对象。在引擎盖下,当我们遍历集合时,首先调用Iterator的方法MoveNext
。如果这是真的,我们得到第一个元素 - 那是当前对象。然后一次又一次地调用名为MoveNext
的方法,直到它返回false。每次调用MoveNext
时,我们都会从集合中获取一个对象,我们会遍历。
为什么我们使用Reset
方法?
正如MSDN中所述:
将枚举数设置为其初始位置,该位置位于第一个位置之前 集合中的元素。
答案 1 :(得分:1)
当您实施界面时,您同意合同:MoveNext和Reset。问题的其他选项是指实现接口的具体类。
答案 2 :(得分:0)
如果MoveNext传递集合的末尾,则枚举数位于集合中的最后一个元素之后,MoveNext返回false。当枚举数位于此位置时,后续对MoveNext的调用也返回false。如果最后一次调用MoveNext返回false,则Current未定义。要再次将Current设置为集合的第一个元素,可以调用Reset,然后调用MoveNext。