首先,來了解一下什麼是委託,什麼是事件,這二者之間有什麼區別?spa
委託:code
(1)是一種數據類型,能夠像類同樣聲明數據類型,聲明變量orm
(2)只有委託才能將方法當作變量來保存對象
(3)不一樣類型的方法須要使用不一樣的委託類型來存儲,因此不一樣類型的方法須要定義不一樣的類來存儲不一樣的對象blog
(4)同一種方法可使用同一個委託類型來存儲繼承
先經過一小段代碼來了解一下事件
//先定義一個委託,委託也能夠聲明變量,還有返回值 public delegate void MyDelegate(); public delegate void MyDelegate1(int n,int m); public delegate void MyDelegate2(string msg); public delegate int MyReturnIntDelegate();//返回爲int類型的委託 class Program { static void Main(string[] args) { M1(SayHello);//將SayHello方法做爲參數傳入 MyDelegate1 d1 = Add;//直接將Add方法賦值個MyDelegate1 d1(2, 3); Console.ReadKey(); } static void SayHello() { Console.WriteLine("hello !"); } static void Add(int n,int m) { Console.WriteLine("MyDelegate1 Result:"+(m+n).ToString()); } static void M1(MyDelegate say)// { say(); }
上面運行的結果爲rem
咱們能夠經過反編譯來看看程序的內部實現string
經過反編譯咱們能夠看到委託繼承自System.MulticastDelegate,而System.MulticastDelegate又繼承自System.Delegateit
說完委託,下面來講說事件。什麼是事件?事件是對象發送的消息,發送信號通知用戶操做。這個操做多是由鼠標單擊引發的,也多是由某些其餘的程序邏輯觸發的。例如當點擊按鈕,彈出一個對話框時,用戶出發的點擊的事件,產生了相應的相應(彈出對話框)。那麼委託和事件有什麼區別呢?
private void Form1_Load(object sender, EventArgs e) { //本身定義一個登錄控件,在窗體加載的時候,myUser1註冊一個事件 myUser1.newEvent += new Action<object, myneweventargs>(myUser1_newEvent); } //登錄校驗 void myUser1_newEvent(object sender, myneweventargs e) { if (e.user == "admin" && e.pwd == "8888") { e.IsOk = true; } }
在編譯後經過反射咱們能夠看到newEvent的內部實際上就是add與remove兩個方法,事件的內部是靠委託來實現的
其實委託與事件沒有太大的可比性,由於委託是一個類型,而事件是一個對象,事件的內部是經過委託來實現的,對於事件來講,內部的add與remove方法,因此事件只能經過「+=」來註冊本身,或是「-=」來註銷本身,外界不能主動觸發事件,既事件是不能經過賦值來註冊事件。