EventHandler 是什麼? 會特別再寫這一篇,
是因為在初學的時候一直分不清楚 EventHandler 與 Event、Delegate 的關係,
加上看大話設計模式的時候,作者直接將 EventHandler 當作宣告 Delegate 的名稱,
讓我更加混亂了,看了好幾篇之後,才慢慢釐清他們之間的關係。
如果你看了官方文件,會發現 EventHandler 也是 Delegate 型別,
前一篇也提到 event 也是一種加了限制的 Delegate ,那他們到底和 Delegate 有什麼差別?
回顧一下前一篇的程式碼 Chapter_14.2 ,如果我們要使用 Event 的時候該怎麼做?
使用Event的步驟
接著以剛剛宣告好的 Delegate 型別去宣告"加上 event 關鍵字的 Delegate 變數",
就能讓別人把 function 委託到 "加上 event 關鍵字的 Delegate 變數",
通常我們都直接稱呼它是一個名叫 notifyObserver 的 Event,委託與呼叫如下:
這時候你可能會想,多宣告一層 Delegate 型別真麻煩,還得替它想一個名稱,
能否省略宣告 Delegate 型別 ,直接宣告 event 呢?
微軟聽到大家的心聲,便有 EventHandler 出現。
帶參數的 EventHandler<TEventArgs>
由於我們上面的範例是有帶參數的,因此先來看如何使用 EventHandler<TEventArgs>。
同樣延續上一篇的範例,但是以 Secretary 這個類別來示範,
它與 Boss 類別使用相同的 EventArgs 類別,notifyObserverEventArgs。
直接使用 EventHandler,然後在<>中填入EventArgs 類別,
就等於你已經宣告了 Delegate 型別,
且該 Delegate 型別已經帶有 object 與 notifyObserverEventArgs 兩種型別的參數,
object 就是將 subject 通知者本身傳遞出去,所以這邊使用 this,
官方格式如下:
對應的 function 宣告如下:
不帶參數的 EventHandler
如果不想帶參數的話,就省略<>,方式如下:
除了傳遞本身的object之外,因為沒有參數,所以直接使用定義好的Empty即可,
這樣也一目了然,知道它就是不傳遞參數的 event。
MSDN上面部傳遞參數的範例找了一下才找到,只有在講解 Empty 時才寫出範例。
這邊要特別注意的是,即使是無參數,
但要託付給這個 event 的 function 也必須宣告出 object 與 EventArgs ,來呼應 EventHandler。
官方宣告如下:
對應的 function 宣告如下:
Observer 註冊事件
來看看實際操作與結果:
輸出:
總結
到這邊,希望可以幫助第一次接觸到C# Event的人有一點概念,分清楚這三者之間的關係,
才不會看到似乎都是相似功能,卻不知道該用哪個。
宣告方式統整
帶參數的 Event ,可以使用 以下兩種方式宣告。
使用 Delegate:
使用 EventHandler<EventArgs>:
與以上兩者對應的 function :
使用 Delegate 的話,可以讓對應的 function 完全不帶參數:
對應的 function :
使用 EventHandler,記得呼叫 event 時第二個參數要給 EventArgs.Empty:
對應的 function :
補充說明:
上述在呼叫 Event 時都會有一個if確認是否已經有 function 註冊 event 了,
實際上可以使用 invoke 去取代這個檢查機制,下次整理 invoke 時再一併說明,
因為 invoke 在不同地方也有不同的含意,第一次接觸到的時候也是霧煞煞。
沒有留言:
張貼留言