什么是事件
- 事件(Event) 基本上說是一個用戶操作,如按鍵、點擊、鼠標移動等等,或者是一些出現,如系統生成的通知。應用程序需要在事件發生時響應事件。例如,中斷。事件是用於進程間通信。
使用事件
- 如何定義事件
- 使用
event
關鍵字
訪問修飾符 event 委托類型 事件名;
- 訂閱與取消事件(使用"+=","-=")
//新郎官類,充當事件發布者角色 class Bridegroom { //自定義委托 public delegate void MarryHandler(string msg); //使用自定義委托類型定義事件,事件名為MarrEvent public event MarryHandler MarrayEvent; //發出事件 public void OnMarriageComing(string msg) { //判斷是否綁定了事件處理方法 if (MarrayEvent!=null) { //觸發事件 MarrayEvent(msg); } } static void Main(string[] args) { //初始化新郎官對象 Bridegroom bridegroom = new Bridegroom(); //實例化朋友對象 Friend friend1 = new Friend("張三"); Friend friend2 = new Friend("李四"); Friend friend3 = new Friend("王五"); //使用"+="訂閱消息 bridegroom.MarrayEvent += new MarryHandler(friend1.SendMessage); bridegroom.MarrayEvent += new MarryHandler(friend2.SendMessage); //使用"-="取消消息 bridegroom.MarrayEvent -= new MarryHandler(friend2.SendMessage); //發出通知 bridegroom.OnMarriageComing("到時來參見婚禮!"); Console.ReadLine(); //輸出結果為 //到時來參加婚禮! //張三收到了,到時候來參加 } //朋友類 public class Friend { //字段 public string Name; //構造函數 public Friend(string name ) { Name = name; } //事件處理函數,該函數符合MarryHandler委托的定義 public void SendMessage(string mssage) { //輸出通知消息 Console.WriteLine(mssage); //對事件做出處理 Console.WriteLine(this.Name+"收到了,到時候來參加"); } } }
- EventHandler系統委托類
EventHandler
系統委托類定義
public delegate void EventHandler(Object sender,EventArgs e);
- 第一個參數
sender
負責保存對觸發事件對象的引用,其類型為Object
- 第二個參數
e
負責保存事件數據,EventArgs
也是.NET
類庫中定義的類,它不保存任何數據
- 擴展EventArgs類
- 因為
EventHandler
只用於處理不包含事件數據的事件.如果我們想要在由這種方式定義的事件中包含事件數據,則可以通過派生EventArgs
類來實現
namespace MyEvent { //自定義事件類,並使其帶有事件數據 public class MarryEventArgs:EventArgs { public string Message; public MarryEventArgs(string msg) { Message = msg; } } //新郎官類,充當事件發布者角色 class Bridegroom { //自定義委托 public delegate void MarryHandler(object sender,MarryEventArgs e); //使用自定義委托類型定義事件,事件名為MarrEvent public event MarryHandler MarrayEvent; //發出事件 public void OnMarriageComing(string msg) { //判斷是否綁定了事件處理方法 if (MarrayEvent != null) { //觸發事件 MarrayEvent(this,new MarryEventArgs(msg)); } } static void Main(string[] args) { //初始化新郎官對象 Bridegroom bridegroom = new Bridegroom(); //實例化朋友對象 Friend friend1 = new Friend("張三"); Friend friend2 = new Friend("李四"); Friend friend3 = new Friend("王五"); //使用"+="訂閱消息 bridegroom.MarrayEvent += new MarryHandler(friend1.SendMessage); bridegroom.MarrayEvent += new MarryHandler(friend2.SendMessage); //使用"-="取消消息 bridegroom.MarrayEvent -= new MarryHandler(friend2.SendMessage); //發出通知 bridegroom.OnMarriageComing("到時來參見婚禮!"); Console.ReadLine(); //輸出結果為 //到時來參加婚禮! //張三收到了,到時候來參加 } //朋友類 public class Friend { //字段 public string Name; //構造函數 public Friend(string name) { Name = name; } //事件處理函數,該函數符合MarryHandler委托的定義 public void SendMessage(object s,MarryEventArgs e) { //輸出通知消息 Console.WriteLine(e.Message); //對事件做出處理 Console.WriteLine(this.Name + "收到了,到時候來參加"); } } } }
- 因為
- 使用
事件的本質
- C#中事件是一個特殊的多路廣播委托,事件默認含有一個私有的委托變量,該變量用於保存對事件處理方法的引用,且該委托類型的變量為私有,只能從定義該事件的類中進行訪問