自從上一次自己寫了一篇對委托的理解之後,剩下的一半-對事件的理解現在才寫出來,也是拖得夠久了。現在我們一起來看看C#的事件吧
首先:為什麼要有事件?
上一篇文章展示了如何聲明委托,調用委托和創建委托的實例。然而,這時委托雖然可以間接調用任意數量的方法,但是我們必須顯式地調用委托,大部分時間,我們需要在特定事件發生時,自動執行委托,就如中介的例子,我們交代中介幫我們賣房子,當有客戶來的咨詢的時候,中介會自己主動帶客戶去了解房子,而不是每次還需要我們去告訴他,你應該帶客戶去看房子。既然委托類似中介,我們就應該讓他有自主的能力。所以事件產生了。
其次:如何聲明事件?
聲明事件的方式和字段差不多的,不過大家要注意,委托是和事件一起的。所以事件的類型必須是委托。如下:
Event DelegateName EventName;
接著:訂閱事件
我們需要事件是因為當這個事件發生時,要引起一些其他變化。當某一個或多個方法訂閱了該事件後,該事件發生時,就會調用所有訂閱了該事件的方法。
進行訂閱的這個代碼和委托添加方法類似。如下:
EvenName+=LeadToEvent();
取消訂閱:
EvenName-=LeadToEvent();
最後:引發事件
引發事件就像調用方法一樣。引發了該事件,訂閱了該事件的方法都會被調用。
現在我們來讓Demo說話吧
1.新建一個MyEventDemo的控制台應用程序:
2.我們新建一個類。聲明自己的委托和事件並添加一個引發事件的方法OnMyEvent
3.我們再新建一個類,裡面添加一些需要訂閱事件的方法
4.在Main函數實例化這兩個類,並讓兩個方法去訂閱這個事件
5.我們假設有一個事情調用了OnMyEvent,然後由於OnMyEvent被調用就會引發MyEvent事件。然後就會調用訂閱了該事件的方法
6.運行程序
我們可以看到,這兩個訂閱了MyEvent事件的方法Show和Show2被調用了。
以上就演示了一個基本的事件。
PS:以下幾點是我自己總結的需要注意的方面
1.最好把事件對應的委托聲明和事件的聲明放在同一個類中。
2.引發事件的方法也和事件放在同一個類中。
3.訂閱事件的方法的參數應該和對應的委托的參數相同。
4.一個方法可以訂閱多個事件,一個事件可以被多個方法訂閱。
如果需要更深入了解事件,大家可以看一下winform中的onclick事件。機制一樣,不過是訂閱事件的方法的參數通常是兩個(object sender,EvenetArgs args)。以上有錯誤歡迎大家指正!!