從物件的角度理解委託以及委託鏈的返回值獲取

2021-04-12 14:23:46 字數 1440 閱讀 3016

1.委託

所有的委託都是從multicastdelegate繼承的。

multicastdelegate並沒有自己的方法,全部是過載delegate的方法。

問題:1.委託(delegate)關鍵字是乙個物件,還是乙個類?

答案:委託是乙個類

2.delegate所宣告的變數是乙個物件,還是乙個類?

答案:其實是乙個類,在編譯時把它翻譯成乙個delegate的繼承類。

3.委託的實質:

委託是乙個函式集合的類,這個集合可以有多個函式,也可以只有乙個函式。

這個類說明了這個集合裡面的方法,因為乙個方法必須有物件才行,所以,必須有乙個屬性能夠說明這個物件,即target屬性。

作為集合類,其中的方法和屬性卻有些奇怪,下面一一作分析:

成員

奇怪內容

解釋

target

乙個集合應該沒有target的,或者說,target也應該是乙個集合

這個target實際上是指向了其最後乙個函式例項的物件。、

method

與上同

與上同

getinvocationlist

取得呼叫列表時,應該返回乙個集合的列表,而在返回的列表中,每乙個物件都是乙個委託。

委託是乙個集合,這個集合裡的每乙個成員又是乙個委託,而每個成員卻是只有乙個成員的集合。實驗也證明了這一點,遍歷這個list,然後取得每乙個成員,取個每個成員的集合,發現這個集合只有乙個成員。

dl(1,2)

從物件角度考慮,應該不會有直接呼叫物件之說,但在這裡卻可以。

.net框架實際在這裡做了特化處理,具體處理如下:

如果這個委託例項只有乙個元素,則呼叫這個元素,如果這個委託例項有多個元素,則依次呼叫每個元素的這個方法。

概念

委託(一般說的概念):指用delegate宣告了的一種型別,實際上是乙個類,繼承自multicasedelegate。

委託例項:是乙個物件,這個物件是屬於乙個委託型別。

事件:就是乙個委託例項,即乙個物件。一般說,使用乙個事件,實際上並不是使用乙個特殊的名詞,而是使用乙個委託例項(即乙個物件)。

4.委託的返回值的捕獲

在呼叫時,不直接調,通過遍歷其委託鍊錶,依次呼叫,然後把返回值傳到乙個序列物件裡面去,則可以得到返回值。

2.委託的呼叫

執行returnint=a.dl(1,2)時,實際上是執行了如下動作:

(1)得到鍊錶

(2)依次呼叫鍊錶中的方法

即returnint=a.dl(1,2)相當於

delegate ds=a.getinvocationlist();

foreach(delegate d in ds)

委託的理解

可以把委託看作乙個通用的方法名,該名稱可以在不同的時刻指向不同的方法,並且可以通過該委託執行這些方法。例子 using system namespace delegate test public int mulfun int a,int b class test b 改變委託物件所指向的方法 dgt...

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

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

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

委託的宣告 public delegate void mydelegate string str 注1.委託的定義和方法的定義類似,只是在前面加了乙個delegate,但委託不是方法,它是一種型別。是一種特殊的型別,看成是一種新的物件型別比較好理解。用於對與該委託有相 同簽名的方法呼叫。2.委託相當...