事件與委托的聯系和區別


-事件是一種特殊的委托的實例,或者說是受限制的委托,是委托一種特殊應用,在類的外部只能施加+=,-=操作符,二者本質上是一個東西。

-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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM