委托是C#中新添加的類型。妳可以把它想成壹個類似於Class的類型,類似於使用類。使用委托時,需要兩步。首先,您需要定義壹個委托,就像定義壹個類壹樣。然後,您可以創建該委托的壹個或多個實例。
定義委托的語法如下:
[public/protected/private]委托returnType delegate name(param type param 1,…)
這是我自己寫的,好像有點奇怪。我解釋壹下,private/protected/private是限定詞,就不多說了。delegate是聲明委托的關鍵字,returnType是返回類型,delegateName是您給委托的名稱。妳可以寫任何妳喜歡的名字,paramtype param1…這是壹個參數列表。說了這麽多,可能看起來不太好理解。我也這麽認為實際來說,委托定義就是在函數定義中添加壹個委托關鍵字。它的功能類似於聲明壹個類:
公共類類名{…}
創建委托的實例:
[public/protected/private]delegate name deleInstanceName = new delegate name(method name)
這類似於實例化壹個類,公共類名實例名=新類名(…),這裏有壹點需要註意,就是MethodName方法要和delegateName的簽名壹致。什麽是簽名壹致性?也就是說MethodName的參數列表和返回值要分別與returnType和(paramtype param1,…)壹致。讓我舉壹個例子來說明:
公共委托string DelegateDemo(string name,int age);
例如,我們如上定義了壹個委托。在編寫方面,我們其實在函數字符串delegate demo(字符串名,Intage)前面加了壹個Delegate關鍵字。讓我們創建壹個函數:
公共字符串AgentDemo(字符串名稱,整數年齡)
{
string rev =
…
返回rev
}
此函數作為參數傳遞給DelegateDemo的實例,然後創建DelegateDemo的實例:
delegate name instance demo = new delegate name(agent demo);
這時候就要講壹致性了,就是AgentDemo和delegateDemo(姑且去掉Delegate)兩個函數的返回值應該是壹樣的。最後,不知道看的人懂不懂。
接下來,我們可以使用這個委托(調用委托),如下所示:
string name = " cshape
int age = 20
instanceDemo(姓名,年齡);
執行instanceDemo時,將執行AgentDemo函數。instanceDemo相當於C中的壹個函數指針,現在這個指針指向AgentDemo的函數入口地址。
2.多點委托
上述委托只包含對壹個方法的調用。如果需要調用多個方法,並且需要多次顯示這個委托,我們還有另壹個選擇。我們可以讓壹個委托包含多個方法,這樣就可以通過壹次顯示調用委托來依次調用多個方法。請看下面的例子:
公共委托void MultiDelegate(字符串名稱);
public void AgentDemo1(字符串str)
{
控制臺。WriteLine(str+" this is agentdemo 1 \ n ");
}
public void AgentDemo2(字符串s)
{
控制臺。WriteLine(s +"這是agent demo 2 \ n ");
}
multi delegate multi demo = new multi delegate(agentdemo 1);
multi demo+= new multi delegate(agent demo 2);
multi demo(" multi demo test:");
輸出應該是:
多模測試:這是AgentDemo1
mutliDemo測試:這是AgentDemo2
妳可以看到我們壹次調用壹個委托,它依次執行方法AgentDemo1和AgentDemo2(根據妳添加方法的順序)。這裏有幾點需要註意:
●委托支持+=和-=等運算符,這些運算符對應於添加或移除方法。
●多點委托不能定義壹個返回值,因為不能處理多個方法的返回值,所以如果妳想使用多點委托,妳應該使用void,否則妳的編譯將返回壹個錯誤。
●多點委托不建議妳在參數列表中有out類型,這樣只會OUT最後壹個方法的值,其他值都會丟失。
3.對委托的理解
首先聲明,這只是我舉的壹個例子,幫助理解委托的過程,很多是經不起推敲的。希望妳能知道。言歸正傳,
妳想吃東西,
但是我自己做不到(客戶端不知道實現細節)。
妳打算找壹家餐館,點川味豬肉米飯(定義傭金)。
妳決定找到妳經常去的名為a的餐館(實例化傭金)
妳打電話給酒店A(傭金電話)
酒店A為您準備了川味豬肉飯(代理)。
吃晚飯真好。
4.使用委托的時機
當需要將壹個方法傳遞給另壹個方法時,可以考慮使用委托。好像不是很好理解。也可以說,當妳確定要處理壹件事,但又不確定處理方式時,可以考慮使用委托。其實單說委托的應用更多的是事件中的應用,似乎有點牽強。
5.委托的例子
我用兩個類來做這個例子。壹個類,我稱之為委托方,另壹個類,我稱之為代理方,代碼如下:
使用系統;
命名空間Visen。演示代表
{
///& lt;總結& gt
///啟動委托演示中的程序入口,包括委托方。
///& lt;/summary & gt;
課程啟動
{
#區域公共方法
#region應用程序的主入口點。
///& lt;總結& gt
///應用程序的主入口點。
///& lt;/summary & gt;
[靜態線程]
靜態void Main(string[] args)
{
控制臺。WriteLine("這是委托演示\ n ");
維森。demo . delegate . Agent ag = new Agent();
//定義委托類型的對象。
out message single dele = new out message(ag。show message);
out message delestatic meth = new out message(代理。SShowMessage);
//定義多點委托。
out message multi dele = new out message(ag。show message);
MultiDele +=新輸出消息(代理。SShowMessage);
singleDele("委托實例single dele ");
deleStaticMeth("委托實例deleStaticMeth ");
MultiDele("這是壹個多元素");
控制臺。read();
}
#endregion應用程序的主入口點。
#endregion公共方法
#區域私有字段
///& lt;總結& gt
///定義委托類型。
///& lt;/summary & gt;
私有委托void OutMessage(字符串msg);
#endregion私有字段
}
}
以下是代理:
使用系統;
命名空間Visen。演示代表
{
///& lt;總結& gt
/// Agent類是委托人的代理,處理委托人委托的事務。
///& lt;/summary & gt;
公共集體代理
{
#區域公共方法
#region null的構造函數
///& lt;總結& gt
///空構造函數
///& lt;/summary & gt;
公共代理()
{
}
#endregion空構造函數
#region向控制臺顯示消息,類成員函數充當代理。
///& lt;總結& gt
///以類成員函數作為代理向控制臺顯示消息。
///& lt;/summary & gt;
///& lt;param name = " msg " & gt顯示內容
公共void ShowMessage(字符串消息)
{
控制臺。WriteLine(" Method show message out:"+msg+" \ n ");
}
#endregion向控制臺顯示壹條消息,類成員函數充當代理。
#region向控制臺顯示壹條消息,壹個類靜態函數充當代理。
///& lt;總結& gt
///向控制臺顯示消息,使用類靜態函數作為代理。
///& lt;/summary & gt;
///& lt;param name = " msg " & gt顯示信息
公共靜態void SShowMessage(字符串消息)
{
控制臺。WriteLine(" static Method SShowMessage out:"+msg+" \ n ");
}
#endregion向控制臺顯示壹條消息,使用類靜態函數作為代理。
#endregion公共方法
}
}
輸出是:
這是壹個代表演示
方法ShowMessage out:委托實例singleDele
靜態方法ShowMessage out:委托實例deleStaticMeth
方法ShowMessage out:這是壹個多元素
靜態方法ShowMessage out:這是壹個多元素
可以看出,方法函數可以是類成員函數,也可以是靜態成員,只要與委托的簽名相同即可。
如有錯誤,請批評指正。謝謝大家!