還是關於「委託」

2021-06-27 19:55:06 字數 4797 閱讀 6656

以下是從網上找來的資料:

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,…)一致。舉個例子來說明下:

publicdelegate string delegatedemo(string name, int age);

比如我們如上定義了乙個委託,就寫法來說,其實就是在函式 string delegatedemo(string name, int age)前面加了乙個delegate的關鍵字,下面我們來用建立乙個函式:

public string agentdemo(string name, intage)

string rev = 「」;

return rev;

這個函式是做引數傳遞給乙個delegatedemo例項的,接下來建立乙個delegatedemo的例項:

delegatenameinstancedemo = 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(stringname);

public void agentdemo1(string str)

console.writeline(str + 「this is agentdemo1\n」);

public void agentdemo2(string s)

console.writeline(s + 「this isagentdemo2\n」);

multidelegate multidemo = newmultidelegate(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

////// startup 委託演示中的程式入口,含委託方。

///

class startup

#region公用的方法

#region應用程式的主入口點。

//////應用程式的主入口點。

///

[stathread]

static void main(string args)

console.writeline("this is adelegate demo\n");

visen.demo.delegate.agent ag =new agent();

//定義乙個委託型別的物件

outmessage singledele = newoutmessage(ag.showmessage);

outmessage delestaticmeth = newoutmessage(agent.sshowmessage);

//定義乙個多點委託

outmessage multidele = newoutmessage(ag.showmessage);

multidele += newoutmessage(agent.sshowmessage);

singledele(" delegateinstance singledele");

delestaticmeth(" delegateinstance delestaticmeth");

multidele(" this is amultidele");

console.read();

#endregion應用程式的主入口點。

#endregion公用的方法

#region私用的字段

//////定義乙個委託型別

///

private delegate void outmessage(string msg);

#endregion私有的字段

下面是**方:

using system;

namespace visen.demo.delegate

////// agent 類為委託者的**方,處理委託者委託的事務。

///

public class agent

#region公用的方法

#region空的建構函式

//////空的建構函式

///

public agent()

#endregion空的建構函式

#region顯示一條資訊到控制台,乙個類成員函式作為**方

//////顯示一條資訊到控制台,乙個類成員函式作為**方

///

///顯示內容

public void showmessage(string msg)

console.writeline("methodshowmessage out:" + msg + "\n");

#endregion顯示一條資訊到控制台,乙個類成員函式作為**方

#region顯示一條資訊到控制台,乙個類靜態函式作為**方

//////顯示一條資訊到控制台,乙個類靜態函式作為**方

///

///顯示資訊

public static void sshowmessage(string msg)

console.writeline("staticmethod sshowmessage out:" + msg + "\n");

#endregion顯示一條資訊到控制台,乙個類靜態函式作為**方

#endregion公用的方法

輸出為:

this is a delegate demo

method showmessage out: delegate instancesingledele

static method sshowmessage out: delegateinstance delestaticmeth

method showmessage out: this is a multidele

static method sshowmessage out: this is amultidele

可見:方法函式可以是類成員函式,也可以是乙個靜態成員,只要和委託的簽名相同就可以了。

有錯的地方,請大家批評指正,謝謝!

關於Predicate委託

關於predicate委託 predicate委託在.net類類庫中經常出現,此委託的定義如下 public delegatebool predicate t obj 從其定義可以看到,此委託引用乙個返回bool 值的方法,在實際開發中,通常使用predicate委託變數引用乙個 判斷條件函式 在判...

關於事件委託

首先,先來看乙個例子 如微博,每一條博文都有事件,如增加 刪除等!這樣子的話我們每次發微博的時候就得在建立的時候把該有的事件給加上。html js var otext document.getelementbyid txt1 var obtn document.getelementbyid btn1...

關於Predicate委託

predicate委託在.net類類庫中經常出現,此委託的定義如下 public delegatebool predicate t obj 從其定義可以看到,此委託引用乙個返回bool 值的方法,在實際開發中,通常使用predicate委託變數引用乙個 判斷條件函式 在判斷條件函式內部書寫 表明 函...