本篇要分享的是事件(Event)與委派(Delegate),這兩者時常都會綁再一起,怎麼說呢?我們先來各別了解什麼是Event?什麼是Delegate?他們都在做些什麼事呢?
一、事件(Event)
事件(Event)是事情的發生、狀態的發生或改變,也可以說是對於這件事去「做通知」這個動作。好比說:有客人來會按門鈴,按下門鈴後就會有鈴聲響起,這就是一個事件。另外一個說法可以說「監聽」,門鈴等待著有緣人來按下它,等待著被觸發。
那麼也有個用法就是「訂閱」,假若你訂閱了文章雜誌,那麼它更新的時候就會通知你,在程式中會使用「+=」或者「-=」來代表新增訂閱或者取消訂閱。
還記得之前的例子,當我們建立一個button(或是其他工具箱裡的物件)快速點兩下進入寫程式的地方時,它就會幫我們先列出這一行的程式(如下)
private void button1_Click(object sender, EventArgs e)
這時button_Click它使用的是件處理器是EventHandler,該處理器就需要有兩個參數一個是名為sender的object、另一個是名為e的EventArgs,這兩個是沒有傳回值的。
怎麼知道處理器是EventHandler?
先看到Form1中有個InitializeComponent(初始化組件)進入看一下它的定義,從中找到button1區塊,可以看到button1.Click使用+=有去訂閱EventHandler這個處理器,也就是說當按下button1按鈕時,它就會觸發button1_Click,也就會去執行我們之前在此按鈕中寫下的程式內容。
二、委派(Delegate)
也有人稱為「委託」,一件事件的發生一定會有傳送方和接收方,介於這兩者中間的媒介就是委派(Delegate)。也就是說客人(傳送方)按下門鈴後,經過門鈴內部的一些處理再去觸發讓鈴聲可以響起,使家人(接收方)聽到,這就是委派。另外一個比喻就是主管叫下屬做事情,就是委託下屬幫忙做事情,這也就是委派。
三、如何使用?看例子
Step1:建立主動方(傳送方)類別,例子:雜誌
Step2:建立被動方(接收方)類別,例子:訂閱者
Step3:主程式撰寫
說明:
【ClassMagazine類別】
1.先將第一步(紅色底線)先做宣告
(delegate是委派所以先做宣告,事件發生時對訂閱者做通知的內容。
event是事件因此再以委派的型別再去做事件項目的宣告也就是newArticle。
[也就是新的文章出來的時候,就會透過委派方式去通知訂閱者,告訴他們新的文章內容] ) 2.第二步(綠框)建立方法
(雜誌有一個方法就是新增文章,它有兩個參數也就是作者和文章內容,由於不確定是否有人訂閱,因此就要使用第三步來做判斷) 3.第三步(藍框)判斷是否有人訂閱
(若沒有人訂閱的話,那麼newArticle= null,因此當有人訂閱時才會去通知訂閱者,newArticle.Invoke()這一個Invoke參數指的就是一開始delegate所定義的參數,它會直接跑到訂閱者的那個類別方法去[也就是主程式的訂閱者的NotifyMe方法中去執行])
※判斷是否有人訂閱這邊的名稱通常會在前面加上On為開頭 【ClassSubscriber類別】
1.這邊的宣告Name指的是訂閱者是誰,Msg就是顯示訊息
2.這邊有個方法是NotifyMe也就是通知我
(當有人訂閱了文章,執行了「雜誌類別」中的newArticle.Invoke()這一行,它就會跑進來這邊作執行,因為主程式的訂閱者使用的是NotifyMe方法,因此才會再執行的時候跑進來) 【主程式】
1.第一步(紅框)建立雜誌公司名為Kitty_Magazie
2.第二步(綠框)建立使用者名為Peggy、Anna
3.第三步(藍框)Peggy、Anna去訂閱Kitty_Magazie
(他們訂閱了Kitty_Magazie後,當Kitty_Magazie新增文章時[雜誌類別做的事],它就會做通知的動作[訂閱者類別中的NotifyMe去做執行])
4.那麼我們用label1用訊息文字來看一下執行狀況。
我們看一下執行結果:
※建議自己操作一次,並且逐步執行了解一下他們之間的關聯會比較好理解哦~
參考資料:
1.C# 事件(Event)
2.[C#語法] 事件(Event)使用簡單三步
3.C# 事件(上) - 使用委派來實作事件
4.C# 事件(下) – 加上event關鍵字
5.C#事件(Event)