IEnumerator 和 IEnumerable 有什么区别?
4 回答
IEnumerable是一个接口,它定义了一个方法GetEnumerator,它返回一个IEnumerator接口,这反过来又允许对集合进行只读访问。实现 IEnumerable 的集合可以与 foreach 语句一起使用。
定义
IEnumerable
public IEnumerator GetEnumerator();
IEnumerator
public object Current;
public void Reset();
public bool MoveNext();
AnIEnumerator
是一个可以枚举的东西:它具有Current
属性和MoveNext
andReset
方法(在 .NET 代码中您可能不会显式调用它们,尽管您可以)。
AnIEnumerable
是一个可以枚举的东西......这仅仅意味着它有一个 GetEnumerator 方法,该方法返回一个IEnumerator
.
你用哪个?使用的唯一原因IEnumerator
是,如果您有某种非标准的枚举方式(即,一个接一个地返回其各种元素),并且您需要定义其工作方式。您将创建一个实现IEnumerator
. 但是你仍然需要IEnumerator
在IEnumerable
课堂上返回它。
要查看枚举器(实现IEnumerator<T>
)的样子,请查看任何Enumerator<T>
类,例如包含在或List<T>
中的类。要查看实现的类,请参阅任何标准集合类。Queue<T>,
Stack<T>
IEnumerable
向您显示Enumerator
列表或集合中的项目。Enumerator 的每个实例都位于某个位置(第 1 个元素、第 7 个元素等),并且可以为您提供该元素 ( IEnumerator.Current
) 或移动到下一个 ( IEnumerator.MoveNext
)。当您foreach
在 C# 中编写循环时,编译器会生成使用枚举器的代码。
AnEnumerable
是一个可以给你Enumerator
s 的类。它有一个名为的方法GetEnumerator
,它为您提供了一个Enumerator
查看其项目的方法。当您foreach
在 C# 中编写循环时,它生成的代码调用GetEnumerator
以创建Enumerator
循环使用的循环。
IEnumerable
并且IEnumerator
都是接口。IEnumerable
只有一种方法称为GetEnumerator
. 此方法返回(因为所有方法都返回包括 void 在内的内容)另一种类型,它是一个接口,该接口是IEnumerator
. 当您在任何集合类中实现枚举器逻辑时,您就实现IEnumerable
了(通用或非通用)。IEnumerable
只有一个方法,而IEnumerator
有 2 个方法(MoveNext
和Reset
)和一个属性Current
。为了便于理解,将IEnumerable
其视为一个包含IEnumerator
在其中的盒子(尽管不是通过继承或包含)。请参阅代码以更好地理解:
class Test : IEnumerable, IEnumerator
{
IEnumerator IEnumerable.GetEnumerator()
{
throw new NotImplementedException();
}
public object Current
{
get { throw new NotImplementedException(); }
}
public bool MoveNext()
{
throw new NotImplementedException();
}
public void Reset()
{
throw new NotImplementedException();
}
}