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.多點委託
前面提到的委託都只包含對乙個方法的呼叫,如果需要呼叫多個方法,需要多次顯示的呼叫這個委託,我們還有另的選擇,我們可以讓乙個委託中包含多個方法,這樣我們一次顯示呼叫委託,就可以按照順序連續的呼叫多個方法。看下面的例子:
public delegate void multidelegate(string name);
public void agentdemo1(string str)
public void agentdemo2(string s)
multidelegate multidemo = new multidelegate(agentdemo1);
multidemo += new multidelegate(agentdemo2);
multidemo(「multidemo test :」);
輸出的結果應該是:
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 委託的用法
委託是乙個類,它定義了方法的型別,使得可以將方法當作另乙個方法的引數來進行傳遞。事件是一種特殊的委託。1.委託的宣告 delegate 類 delegate是一種引用型別,我們在處理他的時候要當作類來看待而不是方法,說白了委託就是對方法或者方法列表的引用,呼叫乙個委託例項就好像是呼叫c 中的指標一 ...
c 委託的常見用法
此篇文章是我乙個小白對委託的理解和總結,請www.cppcns.com高手多多評判指教。委託就是一種後期繫結機制,說的直白點就是在呼叫的時候才去傳遞業務邏輯的一種演算法。委託的建立語法 public delegate int comparison t left,t right 官方給出的定義泛型委託...
委託 執行緒的用法
委託用法簡單步驟 1,定義乙個委託 public delegate void myinvoke treenode str 2,定義需投入委託操作的方法 1,利用this.invoke封裝新增節點 2,還原部分顯示資訊 private void createtreenode treenode node...