委託 Delegate 和 事件(Event)

2021-05-06 17:44:20 字數 4304 閱讀 8764

委託的宣告

public delegate void mydelegate(string str);注1.

委託的定義和方法的定義類似,只是在前面加了乙個

delegate,

但委託不是方法,它是一種型別。是一種特殊的型別

,看成是一種新的物件型別比較好理解。用於對與該委託有相

同簽名的方法呼叫。

2.委託相當於

c++中的函式指標,但它是型別安全的。

3.委託是從

system.delegate

派生,但不能象定義常規型別一樣直接從

system.delegate

派生,對委託的宣告只能通過上面的宣告格式進行定義。關鍵字

delegate

通知編譯器這是一

個委託型別,從而在編譯的時候對該類進行封裝

,對這一過程

c#定義了專門的語法來處理這一過程。

4.不能從乙個委託型別進行派生,因為它也是預設

sealed的5.

委託即可以對靜態方法進行呼叫也可以對例項方法進行呼叫。

6.每個委託型別包含乙個自己的呼叫列表,當組合乙個委託或從乙個委託中刪除乙個委託時都將產生個新的呼叫列表。

7.兩個不同型別的委託即使它們有相同的簽名和返回值,但還是兩個不同型別的委託。但其實在使用中可看作是相同的。

委託的比較 c#

中對委託定義了兩個操作符

== 和

!=在以下情況下兩個委託是相等的:

1.當兩個委託都同時為

null

的時候2.

當兩個委託都不為

null時,

下列情況下是相等的。

a.當兩個委託的各自的呼叫列表只含有乙個入口點的時候

在下列情況下是相等的

(1)

呼叫同一物件的同一靜態方法

(2)

呼叫同一物件的同一例項方法

b.當兩個委託具有多個入口點時

在下列情況下是相等的

(1)只有當它們呼叫列表中的呼叫的方法按順序都一一對應相同的物件及物件的同一方法的時候

如上所述的兩個不同型別的委託但是它們具有相同的簽名和返回值時,只要滿足上述條件的,即使它們型別不同,但比較的結果也是相同的。

委託的異常處理

當呼叫該委託的方法中發生了異常時,首先在呼叫該委託的方法中搜尋

catch

語句塊。如果沒有,則去該委託呼叫的方法中去尋找有沒有

catch

語句塊,這和呼叫方法發生異常的處

理是一樣的。

當呼叫乙個為

null

的委託即委託中列表中不存在呼叫方法時,將發生

nullref

renceexception

委託的注意點

:當乙個委託有多個入口點的時候

,呼叫委託將依該委託的呼叫列表中的方法的順序依次呼叫

.這些方法共享乙個引數集合

,所以當委託有返回值的時候呼叫完這個委託後的返回值是最

後乙個方法的返回值或是有

out引數

.如果該委託的引數為

ref(

引用型別

),那麼在招待第乙個方法的時候如果對這個引數的值有所改變

,那麼這個改變將會影響到後面的方法呼叫

.委託的乙個例子

using system;

using system.collections.generic;

using system.text;

建立乙個委託例項,封裝

c類的靜態方法

m1mydelegate d1 = new mydelegate(c.m1);

d1("d1"); // m1

// 建立乙個委託例項,封裝

c類的靜態方法

m2mydelegate d2 = new mydelegate(c.m2);

d2("d2"); // m2

// 建立乙個委託例項,封裝

c類的例項方法

m3mydelegate d3 = new mydelegate(new c().m3);

d3("d3"); // m3

// 從乙個委託

d3建立乙個委託例項

mydelega

te d4 = new mydelegate(d3);

d4("d4"); // m3

// 組合兩個委託

mydelegate d5 = d1 + d2;

d5 += d3;

d5("d5"); // m1,m2,m3

// 從組合委託中刪除

d3mydelegate d6 = d5 - d3;

d6("d6");

// m1,m2

d6 -= d3; //

雖然d6

呼叫列表中已經沒有

d3了,但這樣只是不可能的移除沒有錯誤發生

d6("d6"); // m1,m2

d6 -= d6;

//d6("d6");

此時d6

的呼叫列表為空,d6為

null,

所以引發

system.nullreferenceexception

mydelegate d7 = new mydelegate(c1.p1);

d7("d7"); // c1.p1

mydelegate d8 = new mydelegate(new c2().p1);

d8("d8"); // c2.p1 }

} // 宣告乙個委託

mydelegate

public delegate void mydelegate(string str);

public class c

", str);}

public static void m2(string str)

", str);}

public void m3(string str)

", str);}}

public class c1

", str);}}

public class c2

", str);

}}    }

事件委託

事件概述

事件就是當物件或類狀態發生改變時,物件或類發出的資訊或通知。發出資訊的物件或類稱為

"事件源

",對事件進行處理的方法稱為

"接收者

",通常事件源在發出狀態改變資訊時,它

並不知道由哪個事件接收者來處理

.這就需要一種管理機制來協調事件源和接收者

,c++

中通過函式指標來完成的.在

c#中事件使用委託來為觸發時將呼叫的方法提供型別安全的封裝

事件的宣告 1.

宣告乙個委託

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

宣告乙個事件

public event eventhandler changed; 3.

引發乙個事件

public onchanged(enventargs e)}

4.定義事件處理程式

public mytext_onchanged(object sender,eventargs e) 5.

訂閱事件

(將事件處理程式新增到事件的呼叫列表中

)mytext.changed += eventhandler(mytext_onchanged);

下面的乙個小例子說明了怎樣定義乙個完整的事件機制

:using system;

using system.collections.generic;

using system.text;

// 將事件處理程式新增到事件的呼叫列表中

(即事件佈線

)mytext.changed += new mytext.changedev

enthandler(mytext_changed);        

string str = "";

while (str != "quit")}

// 對

change

事件處理的程式

private static void mytext_changed(object sender, eventargs e)

/n" ,((mytext)sender).text);

}       

public class mytext

// text

屬性public string text

set}}

委託例項(delegate例項 事件委託通知)

delegate例項 delegate是c 中的一種型別,它實際上是乙個能夠持有對某個方法的引用的類。與其它的類不同,delegate類能夠擁有乙個簽名 signature 並且它只能持有與它的簽名相匹配的方法的引用。它所實現的功能與c c 中的函式指標十分相似。它允許你傳遞乙個類a的方法m 給另乙...

初始delegate委託

剛剛接觸c 不足三個月,最近網上查了一下c 的delegate委託。發現delegate更類似於之前學習c語言時候的指標,可以呼叫其它方法。使用委託可以將方法作為引數來賦值和傳遞。1 定義委託 2public delegate void mytestdelegate int i 3 class pr...

c 中delegate和事件

c 中delegate被稱作是 委託 類似c 中的函式指標,委託也可以指向乙個函式,但是不同的是,委託可以被理解為乙個列表,裡面的元素是一系列返回型別和參數列都相同的函式,之後就可以像使用變數一樣使用函式。system中有很多預先定義好的委託型別可以直接被呼叫,比如eventhandler就是事件的...