C 中的委託和事件用法

2021-10-01 07:26:46 字數 1997 閱讀 2099

delegate

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

使用方法

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

delegate void searchdelegate();

// 這是我們欲傳遞的方法,它與mydelegate具有相同的引數和返回值型別

void searchmethod()

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

//建立方式一:

searchdelegate sd = searchmethod;

//建立方式二:

searchdelegate sd1 = new searchdelegate(this.searchmethod);

//3、非同步呼叫委託方法

sd1 ();

事件處理

c#中的事件處理實際上是一種具有特殊簽名的delegate

public delegate void myeventhandler(object sender, myeventargs e);
其中的兩個引數,sender代表事件傳送者,e是事件引數類。myeventargs類用來包含與事件相關的資料,所有的事件引數類都必須從system.eventargs類派生。當然,如果你的事件不含引數,那麼可以直接用system.eventargs類作為引數。

自定義事件步驟

//1、定義delegate物件

public delegate bool validateresponse(byte response);

//2、用event關鍵字定義事件物件

// 提供驗證respond有效性的方法

public event validateresponse validateresponsehandler;

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

// 指定對response的驗證方法

public static bool handerfunctest(byte byte1)

//4、用+=操作符將事件新增到佇列中

//兩種方式

shakehandrequest.validateresponsehandler += new requestitem.validateresponse(handerfunctest);

shakehandrequest.validateresponsehandler += response =>

//5、呼叫

validateresponsehandler?.invoke(response);

委託和事件的區別

委託是乙個類,該類內部維護著乙個字段,指向乙個方法。事件可以被看作乙個委託型別的變數,通過事件註冊、取消多個委託或方法。

委託可以在本類或者其他類註冊函式,執行函式。

事件可以在本類或者其他類註冊函式,但只能在本類中執行函式。事件可以更好的封裝邏輯,保證耦合度。

C 中的委託和事件

委託類似於c 中的函式指標,c 中的委託申明如下 delegate void mydelegate 只要該委託執行的方法與委託申明的簽名一致,就能呼叫委託來執行該方法,例如在本例中,有個方法為 void method 那麼就可以如下呼叫 mydelegate delegate new mydeleg...

C 中的委託和事件

委託 和 事件在 net framework中的應用非常廣泛,然而,較好地理解委託和事件對很多接觸c 時間不長的人來說並不容易。它們就像是一道檻兒,過了這個檻的人,覺得真是太容易了,而沒有過去的人每次見到委託和事件就覺得心裡憋得慌,渾身不自在。本文中,我將通過兩個範例由淺入深地講述什麼是委託 為什麼...

C 中的委託和事件

較好地理解委託和事件對很多接觸c 時間不長的人來說並不容易。它們就像是一道檻兒,過了這個檻的人,覺得真是太容易了,下面的例子如果能很好的理解了,那麼基本的委託和事件就基本有所了解了!namespace 委託和事件 方法三委託的定義 public delegate void greetdelegate...