上文 c#委托事件入門--第一講:委托入門 中和大家介紹了委托,學習委托必不可少的就要說下事件。以下思明仍然從事件是什麼、為什麼用事件、怎麼實現事件和總結介紹一下事件 1、事件是什麼:. 1.1 NET事件建立在委托機制之上,事件是對委托的封裝。 1.2 事件的分類: 強類型事件和弱類型事件 2、為 ...
上文 c#委托事件入門--第一講:委托入門 中和大家介紹了委托,學習委托必不可少的就要說下事件。以下思明仍然從事件是什麼、為什麼用事件、怎麼實現事件和總結介紹一下事件
1、事件是什麼:.
1.1 NET事件建立在委托機制之上,事件是對委托的封裝。
1.2 事件的分類: 強類型事件和弱類型事件
2、為什麼用事件:
從上文委托入門介紹中我們可以瞭解到,我們可以在客戶端隨意對委托進行操作,一定程度上破壞了面向對象的封裝機制,因此事件的出現就是為了實現對委托的封裝
3、怎麼實現事件:
其實事件的定義很簡單,但是需要依賴委托:關鍵字event就是事件的標識
/// <summary> /// 1、定義一個委托 /// </summary> /// <param name="x"></param> public delegate void BoilHandler(int x); /// <summary> /// 2、聲明一個事件 /// </summary> public event BoilHandler boilHandler;
也就是在上文介紹委托入門的代碼中。聲明一個委托的方法上加上關鍵字event即可,
完整代碼如下:
using System; namespace DelegateDemo { public class Program { public void Write1(int x, int y) { Console.WriteLine("{0}+{1}={2}", x, y, x + y); } public static void Write2(int x, int y) { Console.WriteLine("{0}*{1}={2}", x, y, x * y); } static void Main(string[] args) { GManage gm = new GManage(); gm.delegate1 += new Program().Write1; //先給委托類型的變數賦值 gm.delegate1 += Program.Write2; //給此委托變數再綁定一個靜態方法 gm.SayHello(1, 2); // 將先後調用 Write1 與 Write2 方法 Console.WriteLine("******解綁方法Write2後******"); gm.delegate1 -= Program.Write2; // 委托方法解綁 gm.SayHello(1, 2); // 解綁後只會調用 Write1 Console.ReadKey(); } } public class GManage { /// <summary> /// 1、定義委托,它定義了可以代表的方法的類型 /// </summary> /// <param name="x"></param> /// <param name="y"></param> public delegate void GreetingDelegate(int x, int y); /// <summary> /// 2、聲明一個事件 /// </summary> public event GreetingDelegate delegate1; /// <summary> /// 3、被調用委托的方法 /// </summary> /// <param name="x"></param> /// <param name="y"></param> public void SayHello(int x,int y) { if (delegate1 != null) //如果有方法註冊委托變數 { delegate1(x, y); //通過委托調用方法 } } } }
但是在實現註冊的時候和委托的註冊不一樣,因為事件僅僅提供了 += 和 -= 兩個對外的方法來實現方法的綁定和解綁,如果依舊使用 賦值符號 = ,程式即將報錯。
4、總結
事件的本質就是委托,向外提供兩個訪問方法add_EventName(對應+=)和remove-EventName(對應-=)來實現方法的綁定和解綁,同時更符合面向對象的封裝性和安全性。
碼字不容易,轉載請註明出處。謝謝
源碼鏈接:https://github.com/YaoHigh/DelegateDemo