原創|其它|編輯:郝浩|2009-05-19 13:56:22.000|閱讀 383 次
概述:其實事件只是語法定義上的方便,這篇中分析了下事件跟委托的關系。關鍵還是理解了委托就行。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
其實事件只是語法定義上的方便,這篇中分析了下事件跟委托的關系。關鍵還是理解了委托就行。
這片文章中會介紹下委托跟事件之間的聯系。 上篇 blog 中簡單地介紹了委托的基礎知識。
往往需要再定義一個委托對象,可以看到使用委托進行回調的實現的時候。以及一個對外公開的輔助方法來添加委托的方法,這樣子會使我感覺比較繁瑣。 C# 提供了 event 關鍵字來減輕直接使用委托的負擔,編譯器會自動提供注冊、取消注冊的方法和委托必要的成員。首先來看看定義事件的方法:
1. 先定義委托類型;
2. 通過 event 關鍵字定委托類型的事件。
其次定義了兩個方法 add_OnCacul 跟 remove_OnCacul 可以在看看 add_OnCacul 兩個方法里面的一些核心的東西。 add_OnCaculate 首先我可以看到幫我定義了一個 Cacul 對象。:
從而我也可以想到 remove_OnCacul 方法調用的 Remov 方法。從上面我可以看到其實 event 關鍵字只是提供給我一種語法上的便利措施。 很明顯地看到 add_OnCacul 方法調用的就是委托的 Combin 方法。
當逾越某一個速度時會觸發一個車子爆炸事件。首先看委托跟事件: 這個例子參考的 C# 與 .NET3.0 高級順序設計》上面的使用 Car 來舉例的當車子加速時到一定限制值時會觸發一個預警事件。
publicdelegatevoid CarEventHandl string msg ; publicevent CarEventHandl AbortToBlow; publicevent CarEventHandl Exploded;
EventCar 類中有兩個事件一個是 AbortToBlow 一個是 Explode 下面是 Car 幾個屬性以及字段:
privateconstint MaxSpe =180; publicint CurrSpe { get; privateset; } publicbool IsDead { get; privateset; } publicstring Name { get; privateset; }
其中 IsDead 表示車子是否已經報廢了下面是一個加速的方法:
完整代碼:
客戶端調用:
運行效果:
底層的委托的第一個參數一般為 System.Object 類型的第二個參數一般為派生自 System.EventArg 類型的第一個參數一般表示發送事件的對象,看我定義的事件似乎跟底層的事件有點不一樣。第二個參數表示與該事件相關的參數。可以定義個 CarEventArgs:
publicclass CarEventArg : EventArgs { publicreadonlystring msg; public CarEventArg string Msg { msg = Msg; } }
委托就可以修改成 :
使用時 :
有的時候我監聽的方法也許只需要處置一段簡單的邏輯,上面的時候我當監聽事件的時候都是通過定義一個唯一的與委托簽名匹配的方法。所以每次都定義個方法終究比較麻煩。大都時候我可以通過匿名方法來監聽事件,如 :
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:博客園