<ul id="qxxfc"><fieldset id="qxxfc"><tr id="qxxfc"></tr></fieldset></ul>


      前言

        這兩天一直在想如何結(jié)合實(shí)際案例來(lái)結(jié)束委托與事件的講解,下面講解兩個(gè)事例,用來(lái)加深對(duì)委托及事件的理解。

      事例一(分頁(yè)功能)


        本場(chǎng)景是用來(lái)講解使用的,具體內(nèi)容功能需自行填補(bǔ)實(shí)現(xiàn)。用委托加事件來(lái)實(shí)現(xiàn)分頁(yè)功能的通用。按上一節(jié)講解中的邏輯處理,分為訂閱者和發(fā)布者,一樣的可以先定義訂閱者感興趣的對(duì)象,然后發(fā)布者,訂閱者。再就是主程序調(diào)用。

      ?  
      /// <summary> /// 首先定義訂閱者感興趣的對(duì)象,本例感興趣的是上一頁(yè)下一頁(yè)等方法。這里使用Action抽象 /// </summary>
      public class PageChangeEventArgs : EventArgs { public string Action { get; set;
      }public int PageIndex { get; set; } public PageChangeEventArgs() { } public
      PageChangeEventArgs(string action, int pageIndex) { this.Action = action; this
      .PageIndex = pageIndex; } } /// <summary> /// 定義發(fā)布者 /// </summary> public class
      PageActionPubliser {//定義委托 public delegate void PageActionEventHandler(object
      sender, PageChangeEventArgs e);//定義委托類(lèi)型的事件 public event PageActionEventHandler
      PageAction;//定義保護(hù)方法判斷委托事件是否為空,傳入?yún)?shù)e類(lèi)型為EventArgs protected void
      OnPageAction(PageChangeEventArgs e) {if (PageAction != null) { PageAction(this,
      e); }//PageAction?.Invoke(this, e);也可這樣寫(xiě) } //編寫(xiě)觸發(fā)事件、上一頁(yè) public void
      PreviousClick( PageChangeEventArgs e) { OnPageAction(new PageChangeEventArgs("
      Previous",e.PageIndex)); } //下一頁(yè) public void NextClick( PageChangeEventArgs e)
      { OnPageAction(new PageChangeEventArgs("Next",e.PageIndex)); } } /// <summary>
      /// 定義訂閱者 /// </summary> public class Recevice { /// <summary> /// 具體分頁(yè)內(nèi)容的實(shí)現(xiàn),訂閱者
      /// </summary> public static void BindPage(object sender, PageChangeEventArgs
      e) {//假設(shè)最大頁(yè)數(shù)為10 int MaxIndex = 10; if (e.PageIndex == 0 && e.Action == "Previous
      ") { //當(dāng)前0頁(yè),不能上一頁(yè) } if (e.PageIndex == MaxIndex - 1 && e.Action == "Next") { //
      已是最后一頁(yè),不能下一頁(yè) } switch (e.Action) { case "Previous": e.PageIndex--; break;
      default: e.PageIndex++; break; } Console.WriteLine($"已跳轉(zhuǎn)到第{e.PageIndex}頁(yè)"); } }
      /// <summary> /// 這里使用的是控制臺(tái)應(yīng)用程序進(jìn)行模擬 /// </summary> /// <param
      name="args"></param> class Program { static void Main(string[] args) { //綁定注冊(cè)事件
      PageActionPubliser pageActionPubliser =new PageActionPubliser();
      pageActionPubliser.PageAction+= Recevice.BindPage; Console.WriteLine("
      請(qǐng)選擇上一頁(yè)或者下一頁(yè):上一頁(yè)(A)/下一頁(yè)(B)"); string answer=Console.ReadLine();
      PageChangeEventArgs pageChangeEventArgs= new PageChangeEventArgs(); //假設(shè)當(dāng)前頁(yè)為5
      pageChangeEventArgs.PageIndex =5; if (answer=="A") {
      pageActionPubliser.PreviousClick(pageChangeEventArgs); }else {
      pageActionPubliser.NextClick(pageChangeEventArgs); } } }
        

        在這里委托加事件的分頁(yè)功能實(shí)現(xiàn)完成了。其實(shí)原理很簡(jiǎn)單的,當(dāng)點(diǎn)擊上一頁(yè)或者下一頁(yè)的時(shí)候,這時(shí)候因?yàn)橐驗(yàn)橐呀?jīng)綁定注冊(cè)了這個(gè)事件。
      它就會(huì)具體執(zhí)行其中的操作。還是要具體去實(shí)踐編寫(xiě)操作調(diào)試一下,就很快知道它的執(zhí)行順序、也能很快的掌握的。

      ?

      事例二(新車(chē)到達(dá)提醒)


        這個(gè)案例,簡(jiǎn)要的表述就是在車(chē)庫(kù)中新到達(dá)了車(chē)輛時(shí)會(huì)對(duì)管理者發(fā)送通知。首先我們也先分析下。訂閱者是管理者。訂閱者感興趣的對(duì)象是啥呢?感興趣的對(duì)象是有沒(méi)有新車(chē)達(dá)到。

        然后,我們開(kāi)始這個(gè)的一個(gè)設(shè)計(jì)。

      ? ??
      /// <summary> /// 定義訂閱者感興趣的對(duì)象 /// </summary> public class NewCarsEventArgs :
      EventArgs {public string NewCardName { get; set; } public NewCarsEventArgs() { }
      public NewCarsEventArgs(string newCardName) { this.NewCardName = newCardName; }
      }/// <summary> /// 定義發(fā)布者 /// </summary> public class NewCarsPublisher { public
      delegate void CarsEventHandler(object sender ,NewCarsEventArgs e); public event
      CarsEventHandler Cars;private void OnCars(NewCarsEventArgs e) { if (Cars!=null)
      { Cars(this,e); } } public void NewCarsArrivals(NewCarsEventArgs e) {
      OnCars(e); } }public class NewCarsRecevie { public static void Manager(object
      sender,NewCarsEventArgs e) { Console.WriteLine($"通知:新車(chē){e.NewCardName}到了!"); } }
      class Program { static void Main(string[] args) { NewCarsPublisher
      newCarsPublisher= new NewCarsPublisher(); newCarsPublisher.Cars +=
      NewCarsRecevie.Manager; Console.WriteLine("請(qǐng)輸入到達(dá)車(chē)輛的名稱:"); string name=
      Console.ReadLine(); Console.WriteLine("到達(dá)車(chē)輛是否是新車(chē)(Y/N):"); string answer =
      Console.ReadLine();if (answer=="Y") { NewCarsEventArgs newCarsEventArgs = new
      NewCarsEventArgs() { NewCardName=name};
      newCarsPublisher.NewCarsArrivals(newCarsEventArgs); }else { Console.WriteLine("
      不是新車(chē)不對(duì)訂閱者發(fā)送通知!"); } } }
      ?

        
      謹(jǐn)記,事件基于委托,為委托提供了一種發(fā)布/訂閱機(jī)制。理解發(fā)布訂閱機(jī)制就會(huì)容易多了。一旦理清楚,發(fā)現(xiàn)好像也并不是很難的。多多消化一下,自己動(dòng)手去想一下實(shí)例。去寫(xiě)一下。很快能掌握的。

      總結(jié)

        委托與事件到這里就大結(jié)局了。一些列的問(wèn)題也解決了。心中的疑惑也揭開(kāi)了。下面我們就接著基礎(chǔ)系列寫(xiě)其他的了。

        

        曾經(jīng),我們懵懵懂懂地看完了獅子王,知道有個(gè)勇敢堅(jiān)強(qiáng)的小獅子叫辛巴。

        現(xiàn)在,跨過(guò)山和大海,也走過(guò)人山人海,經(jīng)歷了跌跌撞撞,也遭遇了遺憾離別,我們才發(fā)現(xiàn),其實(shí)辛巴就是我們每一個(gè)自己。

      ?

        25年前看懂的是劇情,25年后讀懂的卻是人生……

        推薦閱讀:《獅子王》重映語(yǔ)錄
      <https://mp.weixin.qq.com/s/4XBmM2YIKO12nhQkeJf08g?scene=25#wechat_redirect>

        

                            c#基礎(chǔ)知識(shí)詳解系列
      <https://www.cnblogs.com/hulizhong/p/11205119.html>

      ?

        歡迎大家掃描下方二維碼,和我一起學(xué)習(xí)更多的C#知識(shí)

      ?

        

      友情鏈接
      ioDraw流程圖
      API參考文檔
      OK工具箱
      云服務(wù)器優(yōu)惠
      阿里云優(yōu)惠券
      騰訊云優(yōu)惠券
      京東云優(yōu)惠券
      站點(diǎn)信息
      問(wèn)題反饋
      郵箱:[email protected]
      QQ群:637538335
      關(guān)注微信

        <ul id="qxxfc"><fieldset id="qxxfc"><tr id="qxxfc"></tr></fieldset></ul>
          国产精品久久久久久久久久久久午衣片 | 人人草人人摸电影 | 亚洲欧美午夜在线观看 | 草草视频在线播放 | 菲律宾肛交 | 公交掀起裙子从后面进去 | 日韩小穴 | 欧美大黄 | 中文字幕免费 | 另类成人 |