C#使用yield關(guān)鍵字構(gòu)建迭代器詳解
以前,如果我們希望構(gòu)建支持foreach枚舉的自定義集合,只能實(shí)現(xiàn)IEnumerable接口(可能還有IEnumerator()),返回值還必須是IEnumerator類型,除此之外還可以通過(guò)迭代器來(lái)使用構(gòu)建foreach循環(huán)的類型,詳細(xì)見(jiàn)下鏈接。
代碼
public class Car { //內(nèi)部狀態(tài)數(shù)據(jù) public int CurentSpeed; public int MaxSpeed; public string name; //汽車能不能用 private bool carIsdead; //類構(gòu)造函數(shù) 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); //定義每個(gè)委托類型的成員變量 private CarEngineHandler listOfhandlers; //向調(diào)用者添加注冊(cè)函數(shù) public void RegisterWithCarEngine(CarEngineHandler methodTocall) { if (listOfhandlers == null) listOfhandlers = methodTocall; else listOfhandlers += methodTocall;//支持多路廣播 } //實(shí)現(xiàn)Accelerate()方法 public void Accelerate(int delta) { if (carIsdead) { if (listOfhandlers != null) { listOfhandlers("sorry,this car is dead"); } } else { CurentSpeed += delta; //不能超過(guò)最大速度 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() { //返回?cái)?shù)組對(duì)象的IEnumerator //return garage.GetEnumerator(); //用yield關(guān)鍵字構(gòu)建迭代器方法 foreach (Car c in garage) { //當(dāng)yield return語(yǔ)句執(zhí)行后,當(dāng)前位會(huì)被 //保存下來(lái),下一次執(zhí)行會(huì)從當(dāng)前位開(kāi)始 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#中可枚舉類型詳解
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C#中利用Lotus notes公共郵箱發(fā)送郵件的方法
這篇文章主要給大家介紹了關(guān)于C#中利用Lotus notes公共郵箱發(fā)送郵件的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。2018-02-02.net 通過(guò) WebAPI 調(diào)用nsfwjs 進(jìn)行視頻鑒別功能
這篇文章主要介紹了.net 通過(guò) WebAPI 調(diào)用 nsfwjs 進(jìn)行視頻鑒別,文末給大家提到了FFMPEG獲取視頻關(guān)鍵幀并保存成jpg圖像的相關(guān)知識(shí),需要的朋友可以參考下2021-09-09關(guān)于C#中ajax跨域訪問(wèn)問(wèn)題
最近做項(xiàng)目,需要跨域請(qǐng)求訪問(wèn)數(shù)據(jù)問(wèn)題。下面通過(guò)本文給大家分享C#中ajax跨域訪問(wèn)代碼詳解,需要的朋友可以參考下2017-05-05WPF開(kāi)發(fā)之UniformGrid和ItemsControl的應(yīng)用詳解
為了簡(jiǎn)化開(kāi)發(fā),WPF提供了UniformGrid布局和ItemsControl容器,本文以一個(gè)簡(jiǎn)單的小例子,簡(jiǎn)述如何在WPF開(kāi)發(fā)中應(yīng)用UniformGrid和ItemsControl實(shí)現(xiàn)均勻的布局,希望對(duì)大家有所幫助2024-01-01Unity實(shí)現(xiàn)菜品識(shí)別的示例代碼
這篇文章主要介紹了如何通過(guò)Unity實(shí)現(xiàn)菜品識(shí)別,可以準(zhǔn)確識(shí)別圖片中的菜品名稱、位置、卡路里信息,并獲取百科信息。感興趣的小伙伴可以了解一下2022-02-02C#開(kāi)發(fā)之微信小程序發(fā)送模板消息功能
這篇文章主要介紹了C#開(kāi)發(fā)之微信小程序發(fā)送模板消息功能,需要的朋友可以參考下2017-09-09C#使用udp如何實(shí)現(xiàn)消息的接收和發(fā)送
這篇文章主要介紹了C#使用udp如何實(shí)現(xiàn)消息的接收和發(fā)送問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02