前言
上一節我們了解學習了委托,委托是類型安全的類,它定義了返回類型和參數的類型。委托類不僅包含對方法的引用,也可以包含對多個方法的引用。
理解委托的一種好的方式是把委托視為是給方法的簽名和返回類型指定名稱。
今天我們繼續來了解委托和事件,現在我們來了解學習一下事件詳解。
事件
事件基於委托,為委托提供了一種發布/訂閱機制,在.Net中隨處可見到這種事件,例如在應用程序中,Button類提供了Click事件,這類事件就是委托。
既然事件是為委托提供了發布/訂閱機制,那么肯定設計到兩個角色,發布者以及訂閱者。
事件發布者(Publisher)--事件的發布者就是一個對象,這個對象維護自身的狀態信息,一旦自身的狀態信息發生了改變,那么便觸發一個事件
事件訂閱者(Subscriber)--對事件感興趣的對象,也可以叫做Receiver,可以注冊感興趣的事件,在觸發一個事件后自動執行這段代碼。
到底事件的一個怎么運行過程呢?在介紹此過程中我們先看下委托與事件的微軟編碼規范吧。
一、上一節講了委托的命名需以EventHandler結束
二、委托原型的定義是一個void返回值而且有兩個參數,一個object類型,一個EventArgs類型(或者繼承此類型的)
三、事件的命令是委托去掉后綴EventHandler
四、繼承了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函數,實例化一個發布者,在發布者中綁定了小明的訂閱事件,然后調用發布者觸發事件的方法。
發布者:
一、聲明一個委托
二、基於委托聲明一個事件
三、一個判斷事件是否為空,然后開始執行處理事件
四、一個調用用來觸發事件的方法
//先定義委托 public delegate void PublishEventHandler(object sender,PubEventArgs e); /// <summary> /// 定義事件,命名為委托去除EventHandler /// </summary> public event PublishEventHandler Publish;
//事件注冊 publiser.Publish += XiaoMing.Receive;
訂閱者:
感興趣的事件,最后的輸出。
訂閱者感興趣的對象:
用來保存處理訂閱者感興趣的對象。
總結
我們仔細考慮下這整個委托與事件,事件的本質也就是對委托的一種使用。看我們事件注冊綁定和多播委托的用法是一樣的,事件的聲明也是使用的委托類。
大家好好想想其中的奧妙,然后理解消化下。其實它們也沒有那么難的。
下一節我們對委托和事件進行深入解析外加實際案例。
歡迎大家掃描下方二維碼,和我一起學習更多的C#知識

