雷火电竞-中国电竞赛事及体育赛事平台

歡迎來(lái)到入門(mén)教程網(wǎng)!

C#教程

當(dāng)前位置:主頁(yè) > 軟件編程 > C#教程 >

C#使用yield關(guān)鍵字構(gòu)建迭代器詳解

來(lái)源:本站原創(chuàng)|時(shí)間:2020-01-10|欄目:C#教程|點(diǎn)擊:

以前,如果我們希望構(gòu)建支持foreach枚舉的自定義集合,只能實(shí)現(xiàn)IEnumerable接口(可能還有IEnumerator()),返回值還必須是IEnumerator類(lèi)型,除此之外還可以通過(guò)迭代器來(lái)使用構(gòu)建foreach循環(huán)的類(lèi)型,詳細(xì)見(jiàn)下鏈接。

 代碼

 public class Car
  {
    //內(nèi)部狀態(tài)數(shù)據(jù)
    public int CurentSpeed;
    public int MaxSpeed;
    public string name;
    //汽車(chē)能不能用
    private bool carIsdead;
    //類(lèi)構(gòu)造函數(shù)
    public Car() { }
    public Car(string name, int currentspeed, int maxspeed = 100)
    {
      this.name = name;
      this.CurentSpeed = currentspeed;
      this.MaxSpeed = maxspeed;
    }
    //定義委托類(lèi)型
    public delegate void CarEngineHandler(string msdForCar);
    //定義每個(gè)委托類(lèi)型的成員變量
    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#中可枚舉類(lèi)型詳解

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持我們。

上一篇:C#通過(guò)KD樹(shù)進(jìn)行距離最近點(diǎn)的查找

欄    目:C#教程

下一篇:C#中值類(lèi)型和引用類(lèi)型解析

本文標(biāo)題:C#使用yield關(guān)鍵字構(gòu)建迭代器詳解

本文地址:http://www.jygsgssxh.com/a1/C_jiaocheng/5454.html

網(wǎng)頁(yè)制作CMS教程網(wǎng)絡(luò)編程軟件編程腳本語(yǔ)言數(shù)據(jù)庫(kù)服務(wù)器

如果侵犯了您的權(quán)利,請(qǐng)與我們聯(lián)系,我們將在24小時(shí)內(nèi)進(jìn)行處理、任何非本站因素導(dǎo)致的法律后果,本站均不負(fù)任何責(zé)任。

聯(lián)系QQ:835971066 | 郵箱:835971066#qq.com(#換成@)

Copyright © 2002-2020 腳本教程網(wǎng) 版權(quán)所有