上一節咱們瞭解學習了委託,委託是類型安全的類,它定義了返回類型和參數的類型。委託類不只包含對方法的引用,也能夠包含對多個方法的引用。html
理解委託的一種好的方式是把委託視爲是給方法的簽名和返回類型指定名稱。c#
今天咱們繼續來了解委託和事件,如今咱們來了解學習一下事件詳解。安全
事件基於委託,爲委託提供了一種發佈/訂閱機制,在.Net中隨處可見到這種事件,例如在應用程序中,Button類提供了Click事件,這類事件就是委託。函數
既然事件是爲委託提供了發佈/訂閱機制,那麼確定設計到兩個角色,發佈者以及訂閱者。學習
事件發佈者(Publisher)--事件的發佈者就是一個對象,這個對象維護自身的狀態信息,一旦自身的狀態信息發生了改變,那麼便觸發一個事件this
事件訂閱者(Subscriber)--對事件感興趣的對象,也能夠叫作Receiver,能夠註冊感興趣的事件,在觸發一個事件後自動執行這段代碼。編碼
到底事件的一個怎麼運行過程呢?在介紹此過程當中咱們先看下委託與事件的微軟編碼規範吧。spa
1、上一節講了委託的命名需以EventHandler結束設計
2、委託原型的定義是一個void返回值並且有兩個參數,一個object類型,一個EventArgs類型(或者繼承此類型的)code
3、事件的命令是委託去掉後綴EventHandler
4、繼承了EventArgs需以EventArgs結尾
下面咱們一塊兒來看一個簡單的委託與事件案例
假設如今電信公司提供一個話費流量查詢的功能,可是其中小明僅關心流量,小紅僅關心話費,小李關心話費和流量。如今設計一段他們查詢流量和話費的功能。
分析下,他們關心感興趣的是流量多少,話費多少。--訂閱者
輸入查詢觸發事件,反饋流量多少,話費多少。--發佈者
/// <summary> /// 全部訂閱者(Subscriber)感興趣的對象,本列中訂閱者感興趣的對象是流量話費及多少 /// </summary> public class PubEventArgs : EventArgs { /// <summary> /// 話費或者流量具體值 /// </summary> public readonly string mobleType; public PubEventArgs() { } public PubEventArgs(string mobleType) { this.mobleType = mobleType; } } /// <summary> /// 發佈者(publiser) /// </summary> public class Publiser { //先定義委託 public delegate void PublishEventHandler(object sender,PubEventArgs e); /// <summary> /// 定義事件,命名爲委託去除EventHandler /// </summary> public event PublishEventHandler Publish; /// <summary> /// 執行函數 /// </summary> /// <param name="e"></param> public void OnPublish(PubEventArgs e) { if (Publish!=null) { this.Publish(this,e); } } /// <summary> /// 事件的觸發 /// </summary> /// <param name="mobleType"></param> public void Use( string mobleType) { OnPublish(new PubEventArgs(mobleType)); } } /// <summary> /// 訂閱者(Subscriber)小明 /// </summary> public class XiaoMing { public static void Receive(object sender, PubEventArgs e) { Console.WriteLine($"您的{e.mobleType}剩餘100G"); } } public class XiaoHong { public static void Receive(object sender,PubEventArgs e) { Console.WriteLine($"您的{e.mobleType}餘額爲100元"); } } public class XiaoLi { public static void Receive(object sender, PubEventArgs e) { Console.WriteLine($"您的流量剩餘100G,您的話費餘額爲100元"); } } /// <summary> /// 小明訂閱了流量 小紅訂閱了話費 小李訂閱了話費流量。分別查詢本身所訂閱的,主流程編寫 /// </summary> class Program { static void Main(string[] args) { //實例化一個發佈者 Publiser publiser = new Publiser(); Console.WriteLine("請輸入您須要查詢的業務:"); string mobleType=Console.ReadLine(); if (mobleType=="流量") { //事件註冊 publiser.Publish += XiaoMing.Receive; } else if (mobleType=="話費") { publiser.Publish += XiaoHong.Receive; } else { publiser.Publish += XiaoLi.Receive; } //調用觸發事件 publiser.Use(mobleType); } }
在Main函數中,進行一個事件的註冊,例如小明,進來Main函數,實例化一個發佈者,在發佈者中綁定了小明的訂閱事件,而後調用發佈者觸發事件的方法。
發佈者:
1、聲明一個委託
2、基於委託聲明一個事件
3、一個判斷事件是否爲空,而後開始執行處理事件
4、一個調用用來觸發事件的方法
//先定義委託 public delegate void PublishEventHandler(object sender,PubEventArgs e); /// <summary> /// 定義事件,命名爲委託去除EventHandler /// </summary> public event PublishEventHandler Publish;
//事件註冊 publiser.Publish += XiaoMing.Receive;
訂閱者:
感興趣的事件,最後的輸出。
訂閱者感興趣的對象:
用來保存處理訂閱者感興趣的對象。
咱們仔細考慮下這整個委託與事件,事件的本質也就是對委託的一種使用。看咱們事件註冊綁定和多播委託的用法是同樣的,事件的聲明也是使用的委託類。
你們好好想一想其中的奧妙,而後理解消化下。其實它們也沒有那麼難的。
下一節咱們對委託和事件進行深刻解析外加實際案例。
歡迎你們掃描下方二維碼,和我一塊兒學習更多的C#知識