c 的委託的用法

2021-06-21 00:25:50 字數 3500 閱讀 3923

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...