foreach的使用需要对象包含GetEnumerator方法的公共定义,然后就是自动调用此方法获得IEnumerator对象来访问枚举数,如何获得公共定义呢,可以继承IEnumerable,也可以可以自定义迭代器,自定义迭代器就是创建一个能够返回IEnumerable或IEnumerator接口对象的成员,只要当编译器检测到迭代器,会自动生成IEnumerable或IEnumerator接口的Current属性、MoveNext和Reset方法。有点绕,总之一句话,你要想用迭代,就需要迭代器,不管你是继承接口得来的还是自定义的。上例子:- class MyClass
- {
- static MyClass mc = new MyClass();
- public virtual IEnumerator GetEnumerator()
- {
- //具体的实现,需要用yield语句返回一个枚举数
- for (int i = 0; i < int.MaxValue; i++)
- {
- yield return i;
- }
- }
- static IEnumerable Func()
- {
- yield return "起来,";
- yield return "不愿做驴的人们,";
- yield return "把我们的肾拿去换钱。";
- yield break;//发出迭代结束信号,这里也可以不加
- }
- static void Main(string[] args)
- {
- foreach (var item in Func())
- {
- Console.WriteLine(item+" ");
- }
- foreach (var item in mc)
- {
- Console.Write(item+" ");
- }
- Console.ReadKey();
- }
复制代码 例子中2个自定义迭代器,自己注意看他们在foreach中怎么调用的。说明一个问题,foreach最后总是会自动调用变量的GetEnumerator方法。把第一个迭代器GetEnumerator改下名字,会发现下面foreach语句报错了,因为反射mc时发现没有GetEnumerator方法了当然编译器就会报错。还有GetEnumerator也可以继承自接口。 |