IEnumerable 只是表明某个对象能够被枚举,真正的工作是由IEnumerator的Current、 MoveNext、Reset完成的,为什么要有2个不同的接口来作枚举呢?主要是考虑到被枚举的对象会有多个独立的客户端调用。
在现实应用中,对于集合以及枚举这些集合的需求非常普遍, 因此在.NET中集合所依赖的接口被设计为公共的。想要实现对象的枚举就必须继承IEnumerable接口。
public interface IEnumerable
{
public IEnumerator GetEnumerator();
}
它只有一个成员:GetEnumerator方法。该方法返回一个世纪的枚举器(enumerator)对象。
要定义一个枚举器就要必须实现IEnumrator接口:
public interface IEnumerator
{
public Boolean MoveNext();
public Object Current { get; }
public void Reset();
}
也就是说如果我们希望一个类型支持枚举特性,那么我们就必须还要额外定义一个辅助类型来实现IEnumerator的所有方法。这个辅助类型通常被定义为一个Nested class声明在主类内部。这样在实现的时候我们发现,在app调用GetEnumerator()方法时,我们需要构造一个辅助类型的实例作为返回值。
1、一个Collection要支持foreach方式的遍历,必须实现IEnumerable接口(亦即,必须以某种方式返回IEnumerator object)。 |