C 中的委託和事件 簡介

2022-05-10 23:03:15 字數 3721 閱讀 7038

c#

中的delegate

和event

在基於windows

平台的程式設計中,事件(

event

)是乙個很重要的概念。因為在幾乎所有的

windows

應用程式中,都會涉及大量的非同步呼叫,比如響應點選按鈕、處理

windows

系統訊息等,這些非同步呼叫都需要通過事件的方式來完成。即使在下一代開發平台——

.net

中也不例外。

那麼什麼是事件呢?所謂事件,就是由某個物件發出的訊息,這個訊息標誌著某個特定的行為發生了,或者某個特定的條件成立了。比如使用者點選了滑鼠、

socket

上有資料到達等。那個觸發(

raise

)事件的物件稱為事件的傳送者(

event sender

),捕獲並響應事件的物件稱為事件的接收者(

event receiver

)。在這裡,我們將要討論的是,在

.net

的主流開發語言

c#中如何使用自定義的事件來實現我們自己的非同步呼叫。在c#

中,事件的實現依賴於

delegate

,因此我們有必要先了解一下

delegate

的概念。

delegate

delegate是c#

中的一種型別,它實際上是乙個能夠持有對某個方法的引用的類。與其它的類不同,

delegate

類能夠擁有乙個簽名(

signature

),並且它只能持有與它的簽名相匹配的方法的引用。它所實現的功能與

c/c++

中的函式指標十分相似。它允許你傳遞乙個類

a的方法

m給另乙個類

b的物件,使得類

b的物件能夠呼叫這個方法

m。但與函式指標相比,

delegate

有許多函式指標不具備的優點。首先,函式指標只能指向靜態函式,而

delegate

既可以引用靜態函式,又可以引用非靜態成員函式。在引用非靜態成員函式時,

delegate

不但儲存了對此函式入口指標的引用,而且還儲存了呼叫此函式的類例項的引用。其次,與函式指標相比,

delegate

是物件導向、型別安全、可靠的受控(

managed

)物件。也就是說,

runtime

能夠保證

delegate

指向乙個有效的方法,你無須擔心

delegate

會指向無效位址或者越界位址。

實現乙個

delegate

是很簡單的,通過以下

3個步驟即可實現乙個

delegate:1

.宣告乙個

delegate

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

建立delegate

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

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

下面是乙個簡單的例子:

using system;

public class mydelegatetest

", name);

} public static void main()

}輸出結果是:

hello, sam1111

了解了delegate

,下面我們來看看,在

c#中對事件是如何處理的。

c#中處理事件

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

delegate

,象下面這個樣子:

public delegate void myeventhandler(object sender, myeventargs e);

其中的兩個引數,

sender

代表事件傳送者,

e是事件引數類。

myeventargs

類用來包含與事件相關的資料,所有的事件引數類都必須從

system.eventargs

類派生。當然,如果你的事件不含引數,那麼可以直接用

system.eventargs

類作為引數。

就是這麼簡單,結合

delegate

的實現,我們可以將自定義事件的實現歸結為以下幾步:

1.定義

delegate

物件型別,它有兩個引數,第乙個引數是事件傳送者物件,第二個引數是事件引數類物件。

2.定義事件引數類,此類應當從

system.eventargs

類派生。如果事件不帶引數,這一步可以省略。

3.定義事件處理方法,它應當與

delegate

物件具有相同的引數和返回值型別。4.用

event

關鍵字定義事件物件,它同時也是乙個

delegate

物件。5

.用+=

操作符新增事件到事件佇列中(

-=操作符能夠將事件從佇列中刪除)。

6.在需要觸發事件的地方用呼叫

delegate

的方式寫事件觸發方法。一般來說,此方法應為

protected

訪問限制,既不能以

public

方式呼叫,但可以被子類繼承。名字是

oneventname。7

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

下面是乙個簡單的例子:

using system;

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

輸出結果如下,黑體為使用者的輸入:

please input 『a』: a

my event is ok!

小結

通過上面的討論,我們大體上明白了

delegate

和event

的概念,以及如何在

c#中使用它們。我個人認為,

delegate在c#

中是乙個相當重要的概念,合理運用的話,可以使一些相當複雜的問題變得很簡單。有時我甚至覺得,

delegate

甚至能夠有指標的效果,除了不能直接訪問實體地址。而且事件也是完全基於

delegate

來實現的。由於能力有限,本文只是對

delegate

和event

的應用作了乙個淺顯的討論,並不深入,我希望本文能夠起到拋磚引玉的作用。真正想要對這兩個概念有更深入的了解的話,還是推薦大家看

msdn

C 中的委託和事件

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

C 中的委託和事件

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

C 中的委託和事件

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