下面開始對事件進行介紹
1、定義事件以及事件的編譯原理
首先定義事件對應的委托:
1 public delegate void ThreeClickEventDel();
然後對應事件變量:(其實就是在委托前面加一個event)
public event ThreeClickEventDel ThreeClickEvent;
反編譯之後:是:一個“私有委托”和兩個“公有”的“add”和“remover”方法
1)因為是私有委托:所以只有類的內部可以調用,在類外部就不能被調用。創建的類的實例也是不能調用的。所以事件是安全的。
因為私有,所以不能使用 “=”對事件進行賦值
2)因為有 “公有” 的add 和 remove,,所以 類的實例 可以對事件 進行 “+=”和“-=”對事件進行 添加 事件和 刪除事件(所以在類的外部可以對事件進行賦值,但是不能調用)
2、委托和事件的區別:
1、委托時數據類型,但是 事件 是數據類型的變量(並且是私有委托)
2、委托可以在類的外部被調用,但是事件不能再類的外部,通過類的實例進行調用(因為是私有委托)
3、委托可以通過“=”、“+=”、“-=”進行賦值,但是事件只能通過“+=”和“-=”對事件進行賦值。(因為事件是私有委托)
3、委托也能注冊事件,為什麼會衍生出事件呢?
委托注冊事件:
1 //定義一個委托 2 public delegate void JingGaoDel(); 3 class Program 4 { 5 static void Main(string[] args) 6 { 7 GuoluFang Guolu = new GuoluFang(); 8 //為 委托注冊 事件 9 Guolu.jingGao = delegate() 10 { 11 Console.WriteLine("水已經燒開了!"); 12 }; 13 for (int i = 0; i <100; i++) 14 { 15 Guolu.ShaoShui(); 16 } 17 Console.ReadKey(); 18 } 19 }
為什麼衍生事件:
1、因為事件只能通過“+=”和“-=”進行賦值,所以可以避免像委托那樣(可能用“=”賦值將原有的事件沖掉)。
2、事件雖然是public 定義的,但是會編譯成“私有的委托”,所以事件只能在類的內部被調用,類的實例不能被調用。
4、使用事件的練習(窺探微軟 的事件)
創建驗證控件:
添加一個UserControl控件,設計如下:
寫後台代碼:
控件後台代碼
主窗體添加驗證控件:
後台代碼:
1 private void Form1_Load(object sender, EventArgs e) 2 { 3 //注冊事件 4 userVilidateControl1.UserViliDating += new UserVilidateDel(userVilidateControl1_UserViliDating); 5 } 6 7 //創建對應方法事件 8 void userVilidateControl1_UserViliDating(object sender, MyEventArgs e) 9 { 10 if (e.UserName == "admin" && e.Pwd == "123") 11 { 12 e.IsSuccess = true; 13 } 14 }