IEnumerator 和 IEnumerable 有什么区别?
4 回答
IEnumerable是一个接口,它定义了一个方法GetEnumerator,它返回一个IEnumerator接口,这反过来又允许对集合进行只读访问。实现 IEnumerable 的集合可以与 foreach 语句一起使用。
定义
IEnumerable
public IEnumerator GetEnumerator();
IEnumerator
public object Current;
public void Reset();
public bool MoveNext();
AnIEnumerator是一个可以枚举的东西:它具有Current属性和MoveNextandReset方法(在 .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是一个可以给你Enumerators 的类。它有一个名为的方法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();
}
}