女兒想吃棒冰了,但又不想自己頂著太陽出去買(買棒冰是乙個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
之前已經對委託和事件有一些些了解,但由於對概念理解的不完全以及不知道如何使用委託和事件,所以一直以來對這二個詞總感覺朦朦朧朧的。這二天頗費了點時間,一邊回顧一邊查閱,一邊理解一邊動手做實驗,因此基本掌握了其概念和運用方法。概念不想再寫了,網上很多 下面是我做的實驗 注釋 更詳盡了解委託和事件的文章 ...