delegate和event的區別

2021-09-30 06:50:52 字數 2131 閱讀 9831

一. delegate

c#**實際上類似於c++中的函式指標,因為c#中不存在指標,所以用**可以完成一些原來在c++中用函式指標完成的操作,例如傳遞乙個類a的方法m給另乙個類b的物件,使得類b的物件能夠呼叫這個方法m。但與函式指標相比,delegate有許多函式指標不具備的優點。首先,函式指標只能指向靜態函式,而delegate既可以引用靜態函式,又可以引用非靜態成員函式。在引用非靜態成員函式時,delegate不但儲存了對此函式入口指標的引用,而且還儲存了呼叫此函式的類例項的引用。其次,與函式指標相比,delegate是物件導向、型別安全、可靠的受控(managed)物件。也就是說,runtime能夠保證delegate指向乙個有效的方法,你無須擔心delegate會指向無效位址或者越界位址。

通過以下3個步驟即可實現乙個delegate: 1.

宣告乙個delegate物件,它應當與你想要傳遞的方法具有相同的引數和返回值型別。

宣告乙個**的例子:

public delegate int mydelegate(string message);

2.建立delegate物件,並將你想要傳遞的函式作為引數傳入。

建立**物件的方法:

1). mydelegate mydelegate = new mydelegate(例項名.方法名);

2). mydelegate mydelegate = new mydelegate(類名.方法名);

注:如果需要**的方法是乙個static靜態方法的話,採用第2種方式,否則採用第1種方式。 3.

在要實現非同步呼叫的地方,通過上一步建立的物件來呼叫方法。

可以直接使用**呼叫**所指向的方法:

mydelegate(向方法傳遞的引數);

下面是一些需要注意的事情:

「**」(delegate)(代表、委託):「**」是型別安全的並且完全物件導向的。

(1)在c#中,所有的**都是從system.delegate類派生的(delegate是system.delegate的別名)。

(2)**隱含具有sealed屬性,即不能用來派生新的型別。

(3)**最大的作用就是為類的事件繫結事件處理程式。

(4)在通過**呼叫函式前,必須先檢查**是否為空(null),若非空,才能呼叫函式。(5)在**例項中可以封裝靜態的方法也可以封裝例項方法。

(6)在建立**例項時,需要傳遞將要對映的方法或其他**例項以指明**將要封裝的函式原型(.net中稱為方法簽名:signature)。注意,如果對映的是靜態方法,傳遞的引數應該是類名.方法名,如果對映的是例項方法,傳遞的引數應該是例項名.方法名。

(7)只有當兩個**例項所對映的方法以及該方法所屬的物件都相同時,才認為它們是想等的(從函式位址考慮)。

(8)多個**例項可以形成乙個**鏈,system.delegate中的定義了用來維護**鏈的靜態方法combion,remove,分別向**鏈中新增**例項和刪除**例項。

(9)**的定義必須放在任何類的外面,如delegate int mydelegate();而在類的方法中呼叫mydelegate d = new mydelegate(myclass.mymethod);來例項化自定義**的例項。

(10)**三步曲:

a.生成自定義**類:delegate int mydelegate();

b.然後例項化**類:mydelegate d = new mydelegate(myclass.mymethod);

c.最後通過例項物件呼叫方法:int ret = d();

二:event

例1事件是特殊型別的多路廣播委託,僅可從宣告它們的類或結構(發行者類)中呼叫。如果其他類或結構訂閱了該事件,則當發行者類引發該事件時,會呼叫其事件處理程式方法。

可以看出,c#中的event是通過delegate實現的,event 只是在delegate基礎上作了兩點限制:

1:客戶只能使用委託所提供的+=和-=行為,不能直接用=,即不影響委託對其他observer的notify.

2:只有宣告類可以呼叫(或激發)乙個事件,外部類不可以直接呼叫其事件。

在乙個c#介面中可以包容方法、c#屬性以及索引器,也可以包容事件,但不能包含委託,因為介面定義的是成員,委託定義的是乙個型別,而事件同樣是成員。

例 1:

例 2:

例 3:

例 4:

委託 Delegate 和 事件(Event)

委託的宣告 public delegate void mydelegate string str 注1.委託的定義和方法的定義類似,只是在前面加了乙個 delegate,但委託不是方法,它是一種型別。是一種特殊的型別 看成是一種新的物件型別比較好理解。用於對與該委託有相 同簽名的方法呼叫。2.委託相...

C 代表(delegate)和事件 event

代表 delegate 它是c 語言裡面的函式指標,代表可以指向某乙個函式,在執行的時候呼叫這個函式的實現。下面來看看它的實現步驟 宣告乙個delegate物件。實現和delegate具有相同引數和返回值的函式實現 可以是靜態和非靜態的 產生乙個delegate物件的時候,把你剛剛實現的函式作為引數...

C 代表(delegate)和事件 event

代表和事件是使用c 語言兩個非常重要的概念,如果你不會使用代表和事件,那就說明你不會用c 進行軟體開發。代表 delegate 它是c 語言裡面的函式指標,代表可以指向某乙個函式,在執行的時候呼叫這個函式的實現。下面來看看它的實現步驟 宣告乙個delegate物件。實現和delegate具有相同引數...