-事件是一種特殊的委托的實例,或者說是受限制的委托,是委托一種特殊應用,在類的外部只能施加+=,-=操作符,二者本質上是一個東西。
-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 Action();
2. 怎樣定義委托實例? Action action;
3. 怎樣定義事件?
先定義委托類型 delegate void ActionHandler(object sender, EventArgs args);
再定義事件實例 event ActionHandler Tick;
記憶的方法:
delegate關鍵字類比於class關鍵字, 定義的是一種委托類型,然后再創建委托示例.
創建委托實例時, 用event關鍵字來修飾就變成了創建一個事件. 也就是事件是一種特殊的委托.
class MyClass { public delegate void CompletedEventHandler();
public event CompletedEventHandler WorkCompleted; public CompletedEventHandler WorkCompletedDelegate; public void Fire() { if (this.WorkCompleted != null) { this.WorkCompleted(); } if (this.WorkCompletedDelegate != null) { this.WorkCompletedDelegate(); } } } class Program { static void TestEvent() { Console.WriteLine("test event"); } static void TestDelegate() { Console.WriteLine("test delegate"); } static void Main(string[] args) { MyClass myObject = new MyClass(); myObject.WorkCompletedDelegate += TestDelegate; myObject.WorkCompleted += TestEvent; myObject.Fire(); myObject.WorkCompletedDelegate(); // myObject.WorkCompleted(); // this line will raise compiling error }