C#使用yield关键字构建迭代器详解
以前,如果我们希望构建支持foreach枚举的自定义集合,只能实现IEnumerable接口(可能还有IEnumerator()),返回值还必须是IEnumerator类型,除此之外还可以通过迭代器来使用构建foreach循环的类型,详细见下链接。
代码
publicclassCar { //内部状态数据 publicintCurentSpeed; publicintMaxSpeed; publicstringname; //汽车能不能用 privateboolcarIsdead; //类构造函数 publicCar(){} publicCar(stringname,intcurrentspeed,intmaxspeed=100) { this.name=name; this.CurentSpeed=currentspeed; this.MaxSpeed=maxspeed; } //定义委托类型 publicdelegatevoidCarEngineHandler(stringmsdForCar); //定义每个委托类型的成员变量 privateCarEngineHandlerlistOfhandlers; //向调用者添加注册函数 publicvoidRegisterWithCarEngine(CarEngineHandlermethodTocall) { if(listOfhandlers==null) listOfhandlers=methodTocall; else listOfhandlers+=methodTocall;//支持多路广播 } //实现Accelerate()方法 publicvoidAccelerate(intdelta) { if(carIsdead) { if(listOfhandlers!=null) { listOfhandlers("sorry,thiscarisdead"); } } else { CurentSpeed+=delta; //不能超过最大速度 if(5==(MaxSpeed-CurentSpeed)&&listOfhandlers!=null) { listOfhandlers("thisspeedisnearlytothemaxspeed"); } if(CurentSpeed>MaxSpeed) { carIsdead=true; } else Console.WriteLine("currentspeed:{0}",CurentSpeed); } } } publicclassGarage:IEnumerable { privateCar[]garage=newCar[3]; publicGarage() { garage[0]=newCar("a",10); garage[1]=newCar("b",13); garage[2]=newCar("c",14); } publicEnumeratorGetEnumerator() { //返回数组对象的IEnumerator //returngarage.GetEnumerator(); //用yield关键字构建迭代器方法 foreach(Carcingarage) { //当yieldreturn语句执行后,当前位会被 //保存下来,下一次执行会从当前位开始 yieldreturnc; } } } classProgram { staticvoidMain(string[]args) { Garageg=newGarage(); foreach(Carcing) { Console.WriteLine("carname:{0}",c.name); } } }
参考:C#中可枚举类型详解
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。