C 中的委託

2021-06-23 02:00:05 字數 3246 閱讀 3025

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關鍵字。委託的宣告指定了乙個返回型別和乙個引數列表 定義了委託之後就可以宣告該委託型別的變數。接著把這個變數初始化為與委託具有相同返回型別和引數列...