對C 委託及事件委託的理解

2021-04-19 22:43:27 字數 3708 閱讀 4671

委託的宣告

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的委託即委託中列表中不存在呼叫方法時,將發生nullrefrenceexception

委託的注意點:

當乙個委託有多個入口點的時候,呼叫委託將依該委託的呼叫列表中的方法的順序依次呼叫.這些方法共享乙個引數集合,所以當委託有返回值的時候呼叫完這個委託後的返回值是最

後乙個方法的返回值或是有out引數.如果該委託的引數為ref(引用型別),那麼在招待第乙個方法的時候如果對這個引數的值有所改變,那麼這個改變將會影響到後面的方法呼叫.

委託的乙個例子

using system;

using system.collections.generic;

using system.text;

// 建立乙個委託例項,封裝c類的靜態方法m2

mydelegate d2 = new mydelegate(c.m2);

d2("d2"); // m2

// 建立乙個委託例項,封裝c類的例項方法m3

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

d3("d3"); // m3

// 從乙個委託d3建立乙個委託例項

mydelegate d4 = new mydelegate(d3);

d4("d4"); // m3

// 組合兩個委託

mydelegate d5 = d1 + d2;

d5 += d3;

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

// 從組合委託中刪除d3

mydelegate 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.changedeventhandler(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}

}}  

自己的一些淺略的理解,還請大家多多批評指正!

C 委託及事件委託的初步理解

委託的宣告 public delegate void mydelegate string str 委託是一種特殊的型別 class 用途是來實現對一種方法的封裝。在某種事件發生時,自動呼叫該方法。好處顯然易見,它使使用者可以自定義自己的方法實現,通過封裝,clr會在相應事件激發時呼叫你定義的方法,實...

C 委託及事件委託的初步理解

委託的宣告 public delegate void mydelegate string str 委託是一種特殊的型別 class 用途是來實現對一種方法的封裝。在某種事件發生時,自動呼叫該方法。好處顯然易見,它使使用者可以自定義自己的方法實現,通過封裝,clr會在相應事件激發時呼叫你定義的方法,實...

C 委託及事件委託的初步理解 經典文章

委託的宣告 public delegate void mydelegate string str 委託是一種特殊的型別 class 用途是來實現對一種方法的封裝。在某種事件發生時,自動呼叫該方法。好處顯然易見,它使使用者可以自定義自己的方法實現,通過封裝,clr會在相應事件激發時呼叫你定義的方法,實...