-事件是一種特殊的委托,或者說是受限制的委托,是委托一種特殊應用,只能施加+=,-=操作符。二者本質上是一個東西。
-event ActionHandler Tick; // 編譯成創建一個私有的委托示例, 和施加在其上的add, remove方法.
-event只允許用add, remove方法來操作,這導致了它不允許在類的外部被直接觸發,只能在類的內部適合的時機觸發。委托可以在外部被觸發,但是別這麼用。
-使用中,委托常用來表達回調,事件表達外發的接口。
-委托和事件支持靜態方法和成員方法, delegate(void * pthis, f_ptr), 支持靜態返方法時, pthis傳null.支持成員方法時, pthis傳被通知的對象.
-委托對象裡的三個重要字段是, pthis, f_ptr, pnext, 也就是被通知對象引用, 函數指針/地址, 委托鏈表的下一個委托節點.
1. 怎樣定義委托類型?
delegate + function signature // delegate相當於class關鍵字, function name相當於定義的委托類型.
delegate void Mydelegate();
2. 怎樣定義委托實例? Mydelegate my;(這個是無返回值的簡單委托定義);
3. 怎樣定義事件?
先定義委托類型 delegate void ActionHandler(object sender, EventArgs args);其實這個參數要不要都可以。
再定義事件實例 event ActionHandler Tick;
記憶的方法:
delegate關鍵字類比於class關鍵字, 定義的是一種委托類型,然後再創建委托示例.
創建委托實例時, 用event關鍵字來修飾就變成了創建一個事件. 也就是事件是一種特殊的委托.
1 class MyClass 2 { 3 public delegate void CompletedEventHandler(); 4 5 public event CompletedEventHandler WorkCompleted; 6 public CompletedEventHandler WorkCompletedDelegate; 7 8 public void Fire() 9 { 10 if (this.WorkCompleted != null) 11 { 12 this.WorkCompleted(); 13 } 14 15 if (this.WorkCompletedDelegate != null) 16 { 17 this.WorkCompletedDelegate(); 18 } 19 } 20 } 21 class Program 22 { 23 static void TestEvent() 24 { 25 Console.WriteLine("test event"); 26 } 27 28 static void TestDelegate() 29 { 30 Console.WriteLine("test delegate"); 31 } 32 33 static void Main(string[] args) 34 { 35 36 MyClass myObject = new MyClass(); 37 myObject.WorkCompletedDelegate += TestDelegate; 38 myObject.WorkCompleted += TestEvent; 39 }
轉載至http://www.cnblogs.com/dirichlet/archive/2013/09/15/3247020.html;
看懂了此篇文章之後,在看看上篇的事件的作用與用法會有感觸,http://www.cnblogs.com/cn-blogs/p/3413652.html
事件就是一個狹義的委托,也就是事件是一個用於事件驅動模型的專用委托.
通俗的講,委托你可以在客戶代碼中直接調用委托來激發委托指向的函數,而事件不可以,事件的觸發只能由服務代碼自己觸發
也就是說在你的代碼裡委托你不但可以安排誰是它的調用函數,還可以直接調用它,而事件不能直接調用,只能通過某些操作觸發
你可以理解事件就是一個或多個委托,此話應該有誤的吧,事件可以有多個事件處理函數,委托同樣也可以是個多播委托
事件就是用委托實現的,當然能讓委托替代一個事件。事件比委托多了兩個私有方法-add和remove.你可以自己寫個事件,然後用反編譯工具看一下就知道怎麼回事了。