這兩天一直在想如何結合實際案例來結束委託與事件的講解,下面講解兩個事例,用來加深對委託及事件的理解。html
本場景是用來說解使用的,具體內容功能需自行填補實現。用委託加事件來實現分頁功能的通用。按上一節講解中的邏輯處理,分爲訂閱者和發佈者,同樣的能夠先定義訂閱者感興趣的對象,而後發佈者,訂閱者。再就是主程序調用。c#
/// <summary> /// 首先定義訂閱者感興趣的對象,本例感興趣的是上一頁下一頁等方法。這裏使用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> /// 定義發佈者 /// </summary> public class PageActionPubliser { //定義委託 public delegate void PageActionEventHandler(object sender, PageChangeEventArgs e); //定義委託類型的事件 public event PageActionEventHandler PageAction; //定義保護方法判斷委託事件是否爲空,傳入參數e類型爲EventArgs protected void OnPageAction(PageChangeEventArgs e) { if (PageAction != null) { PageAction(this, e); } //PageAction?.Invoke(this, e);也可這樣寫 } //編寫觸發事件、上一頁 public void PreviousClick( PageChangeEventArgs e) { OnPageAction(new PageChangeEventArgs("Previous",e.PageIndex)); } //下一頁 public void NextClick( PageChangeEventArgs e) { OnPageAction(new PageChangeEventArgs("Next",e.PageIndex)); } } /// <summary> /// 定義訂閱者 /// </summary> public class Recevice { /// <summary> /// 具體分頁內容的實現,訂閱者 /// </summary> public static void BindPage(object sender, PageChangeEventArgs e) { //假設最大頁數爲10 int MaxIndex = 10; if (e.PageIndex == 0 && e.Action == "Previous") { //當前0頁,不能上一頁 } if (e.PageIndex == MaxIndex - 1 && e.Action == "Next") { //已經是最後一頁,不能下一頁 } switch (e.Action) { case "Previous": e.PageIndex--; break; default: e.PageIndex++; break; } Console.WriteLine($"已跳轉到第{e.PageIndex}頁"); } } /// <summary> /// 這裏使用的是控制檯應用程序進行模擬 /// </summary> /// <param name="args"></param> class Program { static void Main(string[] args) { //綁定註冊事件 PageActionPubliser pageActionPubliser = new PageActionPubliser(); pageActionPubliser.PageAction += Recevice.BindPage; Console.WriteLine("請選擇上一頁或者下一頁:上一頁(A)/下一頁(B)"); string answer=Console.ReadLine(); PageChangeEventArgs pageChangeEventArgs = new PageChangeEventArgs(); //假設當前頁爲5 pageChangeEventArgs.PageIndex = 5; if (answer=="A") { pageActionPubliser.PreviousClick(pageChangeEventArgs); } else { pageActionPubliser.NextClick(pageChangeEventArgs); } } }
在這裏委託加事件的分頁功能實現完成了。其實原理很簡單的,當點擊上一頁或者下一頁的時候,這時候由於由於已經綁定註冊了這個事件。 它就會具體執行其中的操做。仍是要具體去實踐編寫操做調試一下,就很快知道它的執行順序、也能很快的掌握的。學習
這個案例,簡要的表述就是在車庫中新到達了車輛時會對管理者發送通知。首先咱們也先分析下。訂閱者是管理者。訂閱者感興趣的對象是啥呢?感興趣的對象是有沒有新車達到。this
而後,咱們開始這個的一個設計。spa
/// <summary> /// 定義訂閱者感興趣的對象 /// </summary> public class NewCarsEventArgs : EventArgs { public string NewCardName { get; set; } public NewCarsEventArgs() { } public NewCarsEventArgs(string newCardName) { this.NewCardName = newCardName; } } /// <summary> /// 定義發佈者 /// </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($"通知:新車{e.NewCardName}到了!"); } } class Program { static void Main(string[] args) { NewCarsPublisher newCarsPublisher = new NewCarsPublisher(); newCarsPublisher.Cars += NewCarsRecevie.Manager; Console.WriteLine("請輸入到達車輛的名稱:"); string name=Console.ReadLine(); Console.WriteLine("到達車輛是不是新車(Y/N):"); string answer = Console.ReadLine(); if (answer=="Y") { NewCarsEventArgs newCarsEventArgs = new NewCarsEventArgs() { NewCardName=name}; newCarsPublisher.NewCarsArrivals(newCarsEventArgs); } else { Console.WriteLine("不是新車不對訂閱者發送通知!"); } } }
謹記,事件基於委託,爲委託提供了一種發佈/訂閱機制。理解發布訂閱機制就會容易多了。一旦理清楚,發現好像也並非很難的。多多消化一下,本身動手去想一下實例。去寫一下。很快能掌握的。設計
委託與事件到這裏就大結局了。一些列的問題也解決了。心中的疑惑也揭開了。下面咱們就接着基礎系列寫其餘的了。調試
曾經,咱們懵懵懂懂地看完了獅子王,知道有個勇敢堅強的小獅子叫辛巴。code
如今,跨過山和大海,也走過人山人海,經歷了跌跌撞撞,也遭遇了遺憾離別,咱們才發現,其實辛巴就是咱們每個本身。htm
25年前看懂的是劇情,25年後讀懂的倒是人生……對象
歡迎你們掃描下方二維碼,和我一塊兒學習更多的C#知識