委託與事件學習筆記1 什麼是委託?

2021-04-07 05:52:30 字數 2913 閱讀 7466

女兒想吃棒冰了,但又不想自己頂著太陽出去買(買棒冰是乙個method),所以她叫他倒霉的老爸去買(delegate),最後女兒吃到了棒冰。

這就是乙個委託的過程。

接下去,讓我們看看一些對委託的解釋:

委託是用來處理其他語言(如 c++、pascal 和 modula)需用函式指標來處理的情況的。不過與 c++ 函式指標不同,委託是完全面對物件的;另外,c++ 指標僅指向成員函式,而委託同時封裝了物件例項和方法。

委託例項的乙個有趣且有用的屬性是

:它不知道也不關心它所封裝的方法所屬的類

;它所關心的僅限於這些方法必須與委託的型別相容

(第15.1 節)

。這使委託非常適合於「匿名」呼叫。——《c#語言規範》

scott wiltamuth

和anders hejlsberg

這些解釋看起來都是比較艱澀難懂的,讓我們用乙個例子來充分理解乙個簡單的委託吧。

首先,建立乙個father類,擁有2個shared方法(c#為static,即靜態方法):

opentv

buytoys

天下的所有父親都有幫女兒開電視和買玩具的義務,哈哈

public

class father

class

father

public

shared

sub opentv()

subopentv(

byval

msg 

asstring

)console.writeline(

"mission:"&

msg)

console.writeline(

"mission is completed!")

end sub

public

shared

sub buytoys()

subbuytoys(

byval

msg 

asstring

)console.writeline(

"mission:"&

msg)

console.writeline(

"mission is completed!")

end sub

end class

值得注意的是,這2個方法都有乙個string的引數,等會兒定義委託的時候也需要相似的引數,這個後面再講。

然後我們要建立委託。需要注意的是,委託是個類,我們要和對待其他類一樣對待他,建立委託需要2道手續:

1,定義乙個delegate類,這個類應當與你想要傳遞的方法具有相同的引數和返回值型別。

對應上面的說明,我們建立的類如下:

public

delegate

subdelegatebyfather(

byval

msg 

asstring)

c#**:

public

delegate 

void

delegatebyfather(string msg);

2,生成乙個delegate物件,並將你想要傳遞的方法作為引數傳入(就是把你想讓這個委託做的事情傳遞進取)。

對應上門的說明,我們建立的物件如下:

dimmydelegate 

asdelegatebyfather

mydelegate 

=new

delegatebyfather(

addressof

father.buytoys)

c#**:

delegatebyfather mydelegate;

mydelegate

=new

delegatebyfather(father.buytoys);

這2行**我們可以理解成:女兒和老爸簽訂了乙個委託協議(xx條約?),協議的內容是,老爸去做buytoys這件事情。

然後,女兒就可以通過mydelegate這個委託的物件(xx條約),來給老爸發號施令了,**如下:

mydelegate.invoke(

"buy many toys!")

老爸去買玩具吧!

這裡我們

顯式呼叫了delegate類的invoke方法,我們也可以隱式呼叫:

mydelegate(

"buy many toys!")

隱式呼叫看上去就像是乙個函式,其實,編譯器會在il**中自動加上invoke的。

至於c#,只能使用隱式呼叫,用顯式會報錯,c#**如下:

mydelegate(

"buy many toys!")

這樣,乙個簡單的委託過程就結束了,讓我們貼一下完整的主程式吧:

module

module1

submain()

dimmydelegate 

asdelegatebyfather

mydelegate 

=new

delegatebyfather(

addressof

father.buytoys)

mydelegate.invoke(

"buy many toys!")

end sub

public

delegate

subdelegatebyfather(

byval

msg 

asstring

)end module

執行的結果如下:

mission:buy many toys!

mission is completed!

這一節就先說到這,下一節繼續說說委託更近一步的用法。

本文如有不妥,請大家指教。謝謝。

什麼是事件委託

隨著dom結構的複雜化和ajax等動態指令碼技術的運用,事件委託自然浮出了水面。jquery為繫結和委託事件提供了.bind live 和.delegate 方法。本文在討論這幾個方法內部實現的基礎上,展示它們的優劣勢及適用場合。事件委託 事件委託的事例在現實當中比比皆是。比如,有三個同事預計會在周...

什麼是委託?為什麼要使用委託?什麼是事件?

1 什麼是委託?首先宣告乙個委託 public delegate string islengthfive string s 下面寫幾個方法 public string dowork string a public string dosomework string b public string do...

委託與事件學習理解1

之前已經對委託和事件有一些些了解,但由於對概念理解的不完全以及不知道如何使用委託和事件,所以一直以來對這二個詞總感覺朦朦朧朧的。這二天頗費了點時間,一邊回顧一邊查閱,一邊理解一邊動手做實驗,因此基本掌握了其概念和運用方法。概念不想再寫了,網上很多 下面是我做的實驗 注釋 更詳盡了解委託和事件的文章 ...