---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
迭代
迭代器是方法、get访问器或运算符;使得在类或结构中能够支持foreach循环,而不必实现整个“IEnumerable接口,只要提供一个迭代器即可。当编译器检测到迭代器时,会自动生成IEnumerable或IEnumerator接口的Current属性、MoveNext和Reset方法。
说到迭代器,不得不说四个接口,IEnumerator、IEnumerable、IEnumerator<T>、IEnumerable<T>
IEnumerator支持在集合上进行简单的迭代,通过元数据查看到的定义如下:
public interface IEnumerator
{
// 摘要:
// 获取集合中的当前元素。
//
// 返回结果:
// 集合中的当前元素。
object Current { get; }
// 摘要:
// 将枚举数推进到集合的下一个元素。
//
// 返回结果:
// 如果枚举数成功地推进到下一个元素,则为 true;如果枚举数越过集合的结尾,则为 false。
//
// 异常:
// System.InvalidOperationException:
// 在创建了枚举数后集合被修改了。
bool MoveNext();
//
// 摘要:
// 将枚举数设置为其初始位置,该位置位于集合中第一个元素之前。
//
// 异常:
// System.InvalidOperationException:
// 在创建了枚举数后集合被修改了。
void Reset();
}
IEnumerable是一个公开枚举数,如下:
public interface IEnumerable
{
// 摘要:
// 返回一个循环访问集合的枚举数。
//
// 返回结果:
// 一个可用于循环访问集合的 System.Collections.IEnumerator 对象。
[DispId(-4)]
IEnumerator GetEnumerator();
}
后两个其实就是前两个加上一般参数,用于泛型集合上的迭代。
foreach通常只能作用于包含了GetEnumerator方法的公共定义的类型的变量(就是IEnumerable接口、IEnumerable<T>接口中定义的那个方法)想用foreach就要有迭代器,可以继承自接口也可以在类中直接定义迭代器(返回一个IEnumerable或者IEnumerable<T>类型的话方法名无约束,但是想返回IEnumerator或IEnumerator<T>的话那方法名就必须是GetEnumerator),例子: