1.委託概述委託是c#中新加入的乙個型別,可以把它想作乙個和class類似的一種型別,和使用類相似,使用乙個委託時,需要兩個步驟,首先你要定義乙個委託,就像是定義乙個類一樣;然後,你可以建立乙個或多個該委託的例項。
定義乙個委託的語法是這樣的:
[public/protected/private] delegate returntype delegatename(paramtype param1,…)
public class classname
建立乙個委託的例項:
[public/protected/private] delegatename deleinstancename = new delegatename(methodname)
這個類似於例項化乙個類,public classname instancename = new classname(…),這裡有個要注意的地方,即methodname方法要和delegatename的簽名一致。什麼是簽名一致,就是說methodname的引數列表,返回值要分別和returntype、(paramtype param1,…)一致。舉個例子來說明下:
public delegate string delegatedemo(string name, int age);
比如我們如上定義了乙個委託,就寫法來說,其實就是在函式 string delegatedemo(string name, int age)前面加了乙個delegate的關鍵字,下面我們來用建立乙個函式:
public string agentdemo(string name, int age)
這個函式是做引數傳遞給乙個delegatedemo例項的,接下來建立乙個delegatedemo的例項:
delegatename instancedemo = new delegatename(agentdemo);
這時要說到一致了,即agentdemo和宣告委託時的delegatedemo(我們姑且將delegate去掉)這兩個函式的返回值,引數列表要相同。終於說完了,不知道看的人明不明白。
接下來,我們可以使用這個委託了(呼叫乙個委託),如下:
string name = 「cshape」;
int age = 20;
instancedemo(name, age);
當instancedemo執行時,會執行agentdemo函式,instancedemo相當於c裡的乙個函式指標,現在這個指標指向agentdemo的函式入口位址。
2.多點委託
前面提到的委託都只包含對乙個方法的呼叫,如果需要呼叫多個方法,需要多次顯示的呼叫這個委託,我們還有另的選擇,我們可以讓乙個委託中包含多個方法,這樣我們一次顯示呼叫委託,就可以按照順序連續的呼叫多個方法。看下面的例子:
輸出的結果應該是:
multidemo test :this is agentdemo1
mutlidemo test :this is agentdemo2
可以看到我們一次顯示的呼叫乙個委託,它順序的(按照你新增方法的順序)執行了方法agentdemo1和agentdemo2。這裡要注意的有幾點:
● 委託支援 +=,-=這樣的運算子,對應為新增或去掉乙個方法
● 多點委託不可以定義有返回值,因為無法處理多個方法的返回值,所以如果要使用多點委託,應該用void,否則你的編譯會返回乙個錯誤
● 多點委託不建議你的引數列表中有out的型別,這樣只會out最後乙個方法的值,其他的值會丟失。
3.委託的理解
首先申明,這只是我舉的乙個例子,目的是幫助理解委託的過程,其中很多地方都經不起推敲,望大家知悉。言歸正傳,
你想要吃飯,
但是自己又不會做(委託方不知道實現細節),
你計畫找個飯店,叫個回鍋肉飯(定義了乙個委託)
你決定找常去的那家叫做a的飯店(例項化乙個委託)
你打**給a飯店(委託呼叫)
a飯店給你做好了你的回鍋肉飯(**函式工作)
飯來了,真好。
4.委託的使用時機
當你需要把乙個方法傳送給其他方法時,可以考慮使用委託。好像不是很好理解,也可以這樣說,當你確定要處理一件事,但又不能確定處理方法時,可以考慮用委託。其實單獨的說委託的應用好像有點牽強,委託更多的是在事件中的應用。
5.乙個委託的例子
我用兩個類來做這個例子,乙個類,我稱它為委託方,乙個類我稱它為**方,**如下:
using system;
namespace visen.demo.delegate
#endregion應用程式的主入口點。
#endregion公用的方法
#region私用的字段
//////定義乙個委託型別
///private delegate void outmessage(string msg);
#endregion私有的字段
}} 下面是**方:
using system;
namespace visen.demo.delegate
#endregion空的建構函式
#region顯示一條資訊到控制台,乙個類成員函式作為**方
//////顯示一條資訊到控制台,乙個類成員函式作為**方
//////顯示內容
public void showmessage(string msg)
#endregion顯示一條資訊到控制台,乙個類成員函式作為**方
#region顯示一條資訊到控制台,乙個類靜態函式作為**方
//////顯示一條資訊到控制台,乙個類靜態函式作為**方
//////顯示資訊
public static void sshowmessage(string msg)
#endregion顯示一條資訊到控制台,乙個類靜態函式作為**方
#endregion公用的方法
}}輸出為:
this is a delegate demo
method showmessage out: delegate instance singledele
static method sshowmessage out: delegate instance delestaticmeth
method showmessage out: this is a multidele
static method sshowmessage out: this is a multidele
可見:方法函式可以是類成員函式,也可以是乙個靜態成員,只要和委託的簽名相同就可以了。
有錯的地方,請大家批評指正,謝謝!
C 中的委託
委託是個比較讓人費解的東西,最近把這個東西翻來覆去看了幾遍了,有了些想法,希望能對同樣卡在這裡的同志一些啟發。在這裡主要提供一種理解思路,畢竟像基本語法 規範之類的,查參考書是最好的了。首先來看看乙個宣告乙個物件的過程 class someclass 定義乙個類 someclass sample 宣...
C 中的委託
c 中的委託 引言 c 中的委託著實讓我迷惑 我是位初學者 在不同的c 書籍中,還譯為 委派等,經反覆查閱資料和自己動手編寫 才稍稍理出點頭緒。c 中的委託類似於c或c 中的函式指標,但兩者有本質區別 c或c 不是型別安全的,但c 中的委託是物件導向的,而且是型別安全的。從技術角度來講,委託是乙個引...
C 中的委託
委託類似於 c 中的函式指標 但是,委託是型別安全和可靠的。委託是一種儲存函式引用的型別。委託的宣告非常類似於函式,但不帶函式體,且要使用delegate關鍵字。委託的宣告指定了乙個返回型別和乙個引數列表 定義了委託之後就可以宣告該委託型別的變數。接著把這個變數初始化為與委託具有相同返回型別和引數列...