程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 事件與委托的聯系和區別,事件委托區別

事件與委托的聯系和區別,事件委托區別

編輯:C#入門知識

事件與委托的聯系和區別,事件委托區別


事件與委托的聯系和區別

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

-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


C#裡事件與委托有什不同?

事件就是一個狹義的委托,也就是事件是一個用於事件驅動模型的專用委托.

通俗的講,委托你可以在客戶代碼中直接調用委托來激發委托指向的函數,而事件不可以,事件的觸發只能由服務代碼自己觸發

也就是說在你的代碼裡委托你不但可以安排誰是它的調用函數,還可以直接調用它,而事件不能直接調用,只能通過某些操作觸發

你可以理解事件就是一個或多個委托,此話應該有誤的吧,事件可以有多個事件處理函數,委托同樣也可以是個多播委托
 

C#委托與事件的不同

事件就是用委托實現的,當然能讓委托替代一個事件。事件比委托多了兩個私有方法-add和remove.你可以自己寫個事件,然後用反編譯工具看一下就知道怎麼回事了。
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved