C 中的事件與委託

2021-08-25 19:43:19 字數 3179 閱讀 3686

##delegate委託

delegate是c#中的一種型別,它實際上是乙個能夠持有對某個方法的引用的類。與其它的類不同,delegate類能夠擁有乙個簽名(signature),並且它"只能持有與它的簽名相匹配的方法的引用"。

它所實現的功能與c/c++中的函式指標十分相似。它允許你傳遞乙個類a的方法m給另乙個類b的物件,使得類b的物件能夠呼叫這個方法m。但與函式指標相比,delegate有許多函式委託和事件在 .net framework中的應用非常廣泛指標不具備的優點。首先,函式指標只能指向靜態函式,而delegate既可以引用靜態函式,又可以引用非靜態成員函式。在引用非靜態成員函式時,delegate不但儲存了對此函式入口指標的引用,而且還儲存了呼叫此函式的類例項的引用。其次,與函式指標相比,delegate是物件導向、型別安全、可靠的受控(managed)物件。也就是說,runtime能夠保證delegate指向乙個有效的方法,你無須擔心delegate會指向無效位址或者越界位址。

##結合delegate的實現,將自定義事件的實現歸結為以下幾步:

1.定義delegate物件型別,它有兩個引數,第乙個引數是事件傳送者物件,第二個引數是事件引數類物件。它應當與你想要傳遞的方法具有相同的引數和返回值型別。

2.定義事件引數類,此類應當從system.eventargs類派生。如果事件不帶引數,這一步可以省略。

3.定義"事件處理方法,它應當與delegate物件具有相同的引數和返回值型別"。

4.用event關鍵字定義事件物件,它同時也是乙個delegate物件。

5.用+=操作符新增事件到事件佇列中(-=操作符能夠將事件從佇列中刪除)。

6.在需要觸發事件的地方用呼叫delegate的方式寫事件觸發方法。一般來說,此方法應為protected訪問限制,既不能以public方式呼叫,但可以被子類繼承。名字是oneventname。

7. 在適當的地方呼叫事件觸發方法觸發事件。

####舉例說明:

public

class

eventtest

}// 步驟4,用event關鍵字定義事件物件(宣告事件)

private event myeventhandler myevent;

private myeventcls myecls;

public

eventtest()

// 步驟6,以呼叫delegate的方式寫事件觸發函式

protected

void

onmyevent

(system.eventargs e)

public

void

raiseevent()

public

static

void

main()

else

}}

##總結:

1.委託是乙個類,它定義了方法的型別,使得可以將方法當作另乙個方法的引數來進行傳遞,這種將方法動態地賦給引數的做法,可以避免在程式中大量使用if-else(switch)語句,同時使得程式具有更好的可擴充套件性。

2.使用委託可以將多個方法繫結到同乙個委託變數,當呼叫此變數時(這裡用「呼叫」這個詞,是因為此變數代表乙個方法),可以依次呼叫所有繫結的方法。

3.在使用委託的時候,你可以像對待乙個類一樣對待它。即先宣告,再例項化。只是有點不同,類在例項化之後叫物件或例項,但委託在例項化後仍叫委託。

4.事件應該由事件發布者觸發,而不應該由客戶端(客戶程式)來觸發。

##最後以《鴻門宴》中的乙個虛擬情節來體會委託的用法:

鴻門宴之前,項羽和手下的范增和項莊商量好了,等他和劉邦喝酒的時候,項羽左手舉起酒杯,范增就出兵刺殺劉邦;項羽右手舉起酒杯,項莊就出兵刺殺劉邦;如果項羽摔碎了酒杯,范增和項莊就一起出兵刺殺劉邦。

using system;

using system.collections.generic;

using system.linq;

using system.text;

using system.threading.tasks;

namespace 委託

手舉杯"

, hand)

;// 呼叫舉杯事件,傳入左或右手作為引數

if(raiseevent !=

null)}

///

/// 定義項羽摔碎酒杯事件的觸發函式

///

public

void

fall()

}}///

/// 定義項羽部下范增

///

public

class

fanzeng

///

/// 范增對項羽舉杯事件的響應

///

/// 若項羽左手舉杯,則範增發起攻擊

void

xiangyu_raiseevent

(string hand)

}///

/// 范增對項羽摔碎酒杯事件的響應

///

void

xiangyu_fallevent()

///

/// 定義攻擊的函式

///

public

void

attack()

}///

/// 部下項莊

///

public

class

xiangzhuang

///

/// 項莊對項羽舉杯事件的響應

///

/// 若項羽右手舉杯,則攻擊

void

xiangyu_raiseevent

(string hand)

}///

/// 項莊對項羽摔碎酒杯事件的響應

///

void

xiangyu_fallevent()

///

/// 定義攻擊的函式

///

public

void

attack()

}//主函式

c 中的委託與事件

c 委託與事件 一 委託 關鍵字 delegate 委託是c 中的一種型別,它實際上是乙個對某個方法引用的類 委託是一種引用方法型別 一旦為委託分配了方法 委託將與該方法有相同完全的行為 委託具有引數 和返回值 delegate類能擁有乙個簽名 signature 只能持有與他簽名相匹配的方法的引用...

C 中的委託與事件

寫這篇博文的目的是要記錄一下學習委託與事件的心的與 方便之後查閱 1 委託,是乙個函式的簽名,規定了函式的返回值與引數列表。類似於這類函式的乙個 簽名相同但是用途不同的函式s,要執行的時候就通過 來執行,使得函式執行得到諸多的方便。delegate相當於乙個類,具有類的一些特性。2 事件,事件就是應...

C 中的委託與事件 筆記

1.委託是型別安全的 函式,是將方法作為方法引數。委託可以註冊多個方法 委託就是乙個 multicastdelegate類,可以通過 賦值,新增方法 物件方法與靜態方法 內部使用delegate.combine方法新增方法。2.事件 事件也是委託,是對委託的封裝,將委託宣告成private成員,不讓...