首先,來了解一下什么是委托,什么是事件,這兩者之間有什么區別?
委托:
(1)是一種數據類型,可以像類一樣聲明數據類型,聲明變量
(2)只有委托才能將方法當做變量來保存
(3)不同類型的方法需要使用不同的委托類型來存儲,所以不同類型的方法需要定義不同的類來存儲不同的對象
(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(); }
上面運行的結果為
我們可以通過反編譯來看看程序的內部實現
通過反編譯我們可以看到委托繼承自System.MulticastDelegate,而System.MulticastDelegate又繼承自System.Delegate
說完委托,下面來說說事件。什么是事件?事件是對象發送的消息,發送信號通知用戶操作。這個操作可能是由鼠標單擊引起的,也可能是由某些其他的程序邏輯觸發的。例如當點擊按鈕,彈出一個對話框時,用戶出發的點擊的事件,產生了相應的相應(彈出對話框)。那么委托和事件有什么區別呢?
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方法,所以事件只能通過“+=”來注冊自己,或是“-=”來注銷自己,外界不能主動觸發事件,既事件是不能通過賦值來注冊事件。