C#使用yield关键字构建迭代器详解
程序员文章站
2023-12-17 14:54:46
以前,如果我们希望构建支持foreach枚举的自定义集合,只能实现ienumerable接口(可能还有ienumerator()),返回值还必须是ienumerator类型...
以前,如果我们希望构建支持foreach枚举的自定义集合,只能实现ienumerable接口(可能还有ienumerator()),返回值还必须是ienumerator类型,除此之外还可以通过迭代器来使用构建foreach循环的类型,详细见下链接。
代码
public class car { //内部状态数据 public int curentspeed; public int maxspeed; public string name; //汽车能不能用 private bool carisdead; //类构造函数 public car() { } public car(string name, int currentspeed, int maxspeed = 100) { this.name = name; this.curentspeed = currentspeed; this.maxspeed = maxspeed; } //定义委托类型 public delegate void carenginehandler(string msdforcar); //定义每个委托类型的成员变量 private carenginehandler listofhandlers; //向调用者添加注册函数 public void registerwithcarengine(carenginehandler methodtocall) { if (listofhandlers == null) listofhandlers = methodtocall; else listofhandlers += methodtocall;//支持多路广播 } //实现accelerate()方法 public void accelerate(int delta) { if (carisdead) { if (listofhandlers != null) { listofhandlers("sorry,this car is dead"); } } else { curentspeed += delta; //不能超过最大速度 if (5 == (maxspeed - curentspeed) && listofhandlers != null) { listofhandlers("this speed is nearly to the maxspeed"); } if (curentspeed > maxspeed) { carisdead = true; } else console.writeline("current speed:{0}", curentspeed); } } } public class garage : ienumerable { private car[] garage = new car[3]; public garage() { garage[0] = new car("a", 10); garage[1] = new car("b", 13); garage[2] = new car("c", 14); } public enumerator getenumerator() { //返回数组对象的ienumerator //return garage.getenumerator(); //用yield关键字构建迭代器方法 foreach (car c in garage) { //当yield return语句执行后,当前位会被 //保存下来,下一次执行会从当前位开始 yield return c; } } } class program { static void main(string[] args) { garage g = new garage(); foreach (car c in g) { console.writeline("car name:{0}", c.name); } } }
参考:c#中可枚举类型详解
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。