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