針對昨天文章委託:讓方法可以跟簡單物件一樣作為引數進行傳遞,也就是將方法作為引數進行封裝。
方法:本質就是**段
其實也好理解,目的就是為了封裝,多型,既然簡單物件如int i可以做為引數傳遞,那麼語句**段應該也可以作為引數傳遞。
委託之於方法就像父類之於子類
委託就是乙個抽象化的方法型別定義
(目的也是為了方便方法作為引數傳遞,這樣想,又有點泛型的感覺)
簡單物件抽象一次出現了型別委託在il中實際上就是乙個class簡單型別抽象一次出現了泛型
簡單方法抽象一次出現了委託
public delegate void mydelegate();
public static void test()
public delegate void mydelegate();
public static void test()
如果上述理解沒錯的話,再加上我簡單的測試了下,add watch
兩個d,委託d的getinvocation
是一致的,那麼所謂委託鏈跟多播委託在上述的用法上的沒區別的。
委託鏈包裝的方法會順序被執行,如果委託鏈中被呼叫的委託丟擲乙個異常,這樣鏈中的後續所有物件都不會被呼叫。
直接呼叫這個委託鏈(委託鏈本身就是個委託)委託的返回值為非void
的話,只有最後乙個返回值會被保留,之前的都捨棄。
若需解決上述問題,通過呼叫delegate.getinvocation
方法來獲取委託鏈物件陣列,顯示呼叫鏈中的每乙個委託。
delegate.getinvocation
返回乙個delegate
引用構成的陣列,注意是引用,陣列中的每個物件指向乙個委託物件。而指向的這個委託物件又可以有自己的委託引用陣列,一直下去,形成一條委託鏈,是不是有點類似js的原型鏈
。
委託變數可以在定義該委託變數的類外部直接呼叫和用=賦值,一旦向類外部公開(委託變數修飾符為public)委託變數,什麼時候呼叫這個委託變數,你是無法控制的。
事件則不同,在定義事件變數的類外部只能新增或移除處理程式(方法,本質也是委託),而事件在什麼時候,什麼條件下執行只能在定義事件變數的類內部定義。
事件可看作委託的乙個特殊例項。叫例項貌似不太恰當,因為事件本身沒有方法掛載,也就是沒有實現。叫「子委託」 或許合適點,因為委託其實就是class
,那麼事件叫委託的「子類」也未嘗不可。
事件之於委託貌似又類似屬性之於字段
+= -=對應於get set
原文:
c 委託與事件
c 委託與事件 心得 c 用委託來實現事件通知機制。委託相當與c 函式指標。整個過程涉及乙個呼叫者,乙個被呼叫者,還有就是這個委託。實現步驟有以下幾步 1.申明委託,2.定義呼叫者和呼叫的函式,3.定義被呼叫者和具體實現的函式 被呼叫的函式 1.申明委託 在包裡或者類裡,public public ...
C 委託與事件
在c 中,委託類似於c 中的 機制,宣告乙個委託型別,可以分別採用例項方法和靜態方法例項化了委託,所不同的是採用靜態方法例項化的委託,它的 target 屬性為null 而用例項方法例項化的委託,它的 target 屬性為該例項。但是這裡要注意,如果你用 console.writerline del...
C 委託與事件
1.泛型委託 泛型型別 是可適應對多種資料型別執行相同功能的單個程式設計元素。定義泛型類或過程時,無需為可能需要對其執行該功能的每個資料型別定義單獨版本。就好比是帶有可拆卸刀頭的螺絲刀。您檢查需要擰動的螺絲,然後選擇適合該螺絲的刀頭 一字 十字 星形 將正確的刀頭插入到螺絲刀柄上後,您就可以使用螺絲...