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

2021-09-08 23:15:43 字數 4724 閱讀 9718

委託的宣告

public delegate void mydelegate(string str);

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

注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(引用型別),那麼在招待第乙個方法的時候如果對這個引數的值有所改變,那麼這個改變將會影響到後面的方法呼叫.

委託的乙個例子:

1

using

system;

2using

system.collections.generic;

3using

system.text;45

namespace647

}4849//

宣告乙個委託mydelegate

50public

delegate

void

mydelegate(

string

str);

5152

public

classc53

5859

public

static

void

m2(string

str)

6063

64public

void

m3(string

str)

6568}69

70public

class

c17176}

7778

public

class

c279

84} 85}

86

這是另乙個例子:仔細揣摩

1

using

system;

2using

system.collections.generic;

3using

system.linq;

4using

system.text;56

namespace

委託_練習_47"

,song(5,

1));

17console.writeline(

"__________________

",dd.testa());

18console.readkey(

true

);19}20

classa21

27}28public

classb29

39public

intmax(

inti1,

inti2)

4043}44

}45}

呼叫委託

1

呼叫委託 使用和呼叫方法相同的方法。 例如:

2mydelegate del();

3...

4del();

宣告事件

選定關鍵字event,再寫型別的名稱(型別必須是乙個委託型別),再寫事件的名稱,例如:

1

delegate

void

mydelegate();

2class

myclass3

訂閱事件(成為事件的訂閱者)

用new操作符建立乙個委託例項(該委託具有與事件相同的型別)然後使用+=操作符,將委託例項同事件關聯起來。例如:

1

class

myeventhandlingclass29

10private

void

eventhandlingmethod()

1114

private

myclass myclass

=new

myclass();15}

還可以直接指定訂閱方法,讓編譯器自動生成新的委託:

1

public

void

start()2

取消事件訂閱(不再成為乙個事件的訂閱者)

建立乙個委託例項(該委託具有與事件相同的型別),然後使用+=操作符使委託例項從事件中脫離。例如:

1

class

myeventhandlingclass28

9private

void

eventhandlingmethod()

1013

private

myclass myclass

=new

myclass();

1415}16

或者:17

private

void

stop()18

引發乙個事件

像呼叫方法那樣「呼叫」事件(在事件名稱後新增一對圓括號)。如果定義事件的委託要求引數,那麼還是提供對應的。引發事件之前,不要忘記檢查事件是否為null。例如:

1

class

myclass211

}12...13}

事件的宣告

1.宣告乙個委託

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

2.宣告乙個事件

public event eventhandler changed;

3.引發乙個事件

1

public

onchanged(enventargs e)27

} 4.定義事件處理程式

public mytext_onchanged(object sender,eventargs e)

5.訂閱事件(將事件處理程式新增到事件的呼叫列表中)

mytext.changed += eventhandler(mytext_onchanged);

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

1

using

system;

2using

system.collections.generic;

3using

system.text;45

namespace623

}2425//

對change事件處理的程式

26private

static

void

mytext_changed(

object

sender, eventargs e)27

30}

3132

public

class

mytext

3348

49//

text屬性

50public

string

text

5153

set5459}

60}61}

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會在相應事件激發時呼叫你定義的方法,實...