C delegate委託及事件

2021-06-23 02:55:20 字數 1731 閱讀 3204

delegate是什麼?官方理解為委託,我這裡把它理解成**的意思,什麼是**?我們在公司請假時都會有**人,就是他來替代你來幹接下來的任務。

c#的委託是一種安全地封裝方法的型別,它與 c 和 c++ 中的函式指標類似。與 c 中的函式指標不同,委託是物件導向的、型別安全的和保險的。委託的型別由委託的名稱定義。

c#中的委託只指向方法的,可以是例項方法也可以是靜態方法。委託型別派生自 .net framework 中的 delegate 類。委託型別是密封的,不能從 delegate 中派生委託型別,也不可能從中派生自定義類。由於例項化委託是乙個物件,所以可以將其作為引數進行傳遞,也可以將其賦值給屬性。

下面的示例宣告了乙個名為 del 的委託,該委託可以封裝乙個採用字串作為引數並返回 void 的方法。

public delegate void del(string message);

1.**宣告的語法:

[public/private] delegate 《返回值型別》 《**名稱》(《引數列表》);

[public/private]:訪問修飾符。

delegate:**宣告關鍵定,相當於類宣告的class關鍵定

《返回值型別》:**所指向的方法的返回值型別

《**名稱》:**型別的名稱

《引數列表》:**所的指向的方法的引數列表。

要想使**物件能夠指向乙個方法,那這個方法的要滿足兩個條件

a.方法返回型別要與delegate宣告中的「返回值型別」一致。

b.方法的形參形表要與delegate宣告中的「引數列表」一致。

2、**的例項化

上面的宣告相當於定義了乙個型別,要想用它,必須進行例項化。

del delhandler = new del(method);

引數中的method就是和委託簽名一樣的函式。

public void method(string mes)

3、呼叫

就和呼叫方法一樣,直接呼叫就可以了。

delhandler("hello world");

另外**也有另外一種,是多播**,乙個**上指定多個方法。當執行**時,這多個方法依次執行。

[public/private] delegate void 《**名稱》(《引數列表》);

多播**所指向的方法應當是void型別(這和上面有點區別)

例項化和上面是一樣的,只是掛接時需要掛多個。

del delhandler = new del(method);

delhandler += new del(method1);

delhandler("hello world multi");

這樣的上面method和method1會依次執行。

**的主要應用就是在事件處理,所以研究事件之前我們必須要理解delegate的概念。

.net framework 類庫中的所有事件均基於 eventhandler 委託,定義如下:

public delegate void eventhandler(object sender, eventargs e);

1.事件的定義使用event關鍵字:

public event del delhandler;

從上面的**我們可以看出來:事件就是乙個**型別的變數。

2.指定事件處理程式:

指定事件處理程式就是為事件掛接方法的過程。

delhandler +=new del(method);   //註冊事件,傳入方法

3.執行事件

C Delegate(委託)小案例

委託 一種型別,表示方法引用的型別 乙個委託是乙個指向方法的引用,或者說,乙個委託的例項就是乙個指向某個方法的物件,這是乙個簡單卻十分強的的概念 首先委託的定義格式 public delegate 返回值 mydelegate 引數列表 其實委託的定義和函式的定義差不多,就是委託多了乙個deleag...

C Delegate 委託 與多執行緒

很多時候寫windows程式都需要結合多執行緒,在.net中用如下得 來建立並啟動乙個新的執行緒。public void threadproc thread thread new thread new threadstart threadproc thread.isbackground true t...

C Delegate 委託 與多執行緒

很多時候寫windows程式都需要結合多執行緒,在.net中用如下得 來建立並啟動乙個新的執行緒。public void threadproc thread thread new thread new threadstart threadproc thread.isbackground true t...