C 簡單的理解委託和事件

2021-08-21 20:07:07 字數 1664 閱讀 3285

在c++中可以利用「函式指標」將對方法的引用作為實參傳遞給另乙個方法,而c#中可以利用委託提供相同的功能。

但是委託實際上是乙個特殊的類。委託必須直接或間接的派生自system.delegate。實際的委託型別總是派生自system.multicastdelegate(建立委託的時候,編譯器自動繼承的是multicastdelegate而不是delegate),後者又從delegate派生。

委託內部包含了幾個重要的屬性:第乙個就是system.reflection.methodinfo型別的,它描述了特定方法的簽名,包括方法名稱、引數和返回型別。除了methodinfo,委託還需要乙個物件例項,其中包含了要呼叫的方法,這是第二個屬性target的作用。(如果是靜態方法,則target對應型別自身)。

為了減少自定義委託型別的必要,.net 3.5包含了一組通用的委託,其中大多數都是泛型。system.func系列委託代表有返回值的方法,而system.action表示返回void的方法。

public delegate void action();

public delegate void action(t arg)

public delegate void action(in t1 arg1,in t2 arg2)

public delegate void action(in t1 arg1,in t2 arg2,in t3 arg3)

…….public delegate void action(t1 arg1,t2 arg2,t3 arg3,t4 arg4,t5 arg5,t6 arg6,t7 arg7,t8 arg8,t9 arg9,t10 arg10, t11 arg11,t12 arg12, t13 arg13, t14 arg14,t15 arg15, t16 arg16)

public delegate tresult func();

public delegate tresult func(t arg);

public delegate tresult func(t1 arg1,t2 arg2);

……public delegate tresult  func(t1 arg1,t2 arg2, t3 arg3, t4 arg4, t5 arg5, t6 arg6,t7 arg7,t8 arg8, t9 arg9, t10 arg10, t11 arg11, t12 arg12, t13 arg13, t14 arg14, t15 arg15,t16 arg16)

說到事件,得知道委託的幾個缺陷:

1、在使用+=賦值操作符時使用了=,會導致乙個全新的委託鏈代替了前面鏈,這是乙個十分容易犯的錯誤,所以event提供了額外的封裝,避免不小心取消了其他訂閱者。

2、可以在委託包容類的外部呼叫委託,這是由於委託的封裝不充分。

3、普通委託還有乙個不利之處在於,很容易忘記在呼叫委託之前檢查null值(在c#6中使用 ?.  null條件操作符),這會引發乙個異常。

而事件就可以很簡單的理解了,就是對委託的進一步封裝,解決了委託存在的一些缺陷。

事件限制外部類只能通過+=操作符向發布者新增訂閱方法,並用-=操作符取消訂閱,除此之外什麼都不能做。此外,還禁止除包容類之外的任何其他類呼叫事件。為了達到上述目的,c#編譯器會獲取帶有event修飾符的public委託變數,並將委託宣告為private。此外,它還會新增兩個方法和兩個特殊的事件塊,這裡就不展開了。

簡單理解委託和事件

什麼是委託?委託就是持有乙個或者多個方法的物件!並且該物件可以執行,可以傳遞。宣告委託型別?委託可以持有方法,那麼持有什麼樣的方法呢?可以宣告,它是一種引用型別。delegate void actcute 定義委託型別的物件?既然是種型別,就可以定義該型別的物件。actcute actcute 給委...

C 委託和事件的理解

委託 private delegate string getastring 委託的定義,使用delegate關鍵字 兩種指向方法的寫法 getastring a new getastring x.tostring a指向了x中的tostring方法 getastring a x.tostring 兩...

c 委託和事件再理解

委託 c 中的委託類似於 c 或 c 中的函式指標。使用委託使程式設計師可以將方法引用封裝在委託物件內。然後可以將該委託物件傳遞給可呼叫所引用方法的 而不必在編譯時知道將呼叫哪個方法。與 c 或 c 中的函式指標不同,委託是物件導向 型別安全的,並且是安全的。委託宣告定義一種型別,它用一組特定的引數...