學習筆記 C 中的委託(delegate)

2022-09-14 13:45:13 字數 1823 閱讀 8220

delegate

一、什麼是委託?

委託是一種引用型別,它是函式指標的託管版本。在c#中,委託是一種可以把引用儲存為函式的型別。委託可以引用例項和靜態方法,而函式指標只能引用靜態方法。委託的宣告非常類似於函式,和函式不同的的是委託不帶函式體,並且需要delegate關鍵字。委託的宣告指定了乙個函式簽名,其中包含引數列表和和乙個返回型別。在定義了委託後,就可以宣告該委託型別的變數,然後可以將這個變數初始化為與該委託有相同簽名的函式進行引用,隨後可以使用委託變數呼叫該函式。(ps:其實委託他丫的就是乙個類,他的目的就是將方法可以作為其他方法的引數傳遞!)

委託雖然與函式指標非常相似,但卻不是指標。許多人把.net中的委託理解為安全的函式指標,這是比較牽強的,委託實現的功能和函式指標非常類似的一點就是提供了程式**機制。

二、委託四部曲:1、宣告委託型別

2、有乙個方法包含了執行的**

3、建立委託例項

4、呼叫委託例項

三、例子:(1)

using

system;

namespace

static

void main(string

args)

}}

(2)使用匿名方法,如下,可以看到這樣就不需要再定義乙個add函式了,

using

system;

namespace

; adddelete(

1,2);

console.readline();}}

}

四、c#中被委託的方法必須是靜態的嗎?

using

system;

namespace

}static

void main(string

args)

}}

通過上面的**可以看出,委託既可以繫結靜態方法也可以繫結例項方法。但是在繫結例項方法的時候,delegate的target屬性就被設定為指向這個例項方法所屬型別的乙個例項物件。當繫結靜態方法時,delegate的target屬性就給null

五、什麼是多播委託?

每個委託都只包含乙個方法呼叫,呼叫委託的次數與呼叫方法的次數相同。如果要呼叫多個方法,就需要多次顯示呼叫這個委託。當然委託也可以包含多個方法,這種委託成為多播委託。

呼叫過程中:1、多播委託包含乙個以上方法的引用且必須是同型別的

2、多播委託包含的方法必須返回void,否則會丟擲run-time exception,並且不能帶引數(但可以帶引用引數)

例子:

using

system;

namespace

static

int add2(int

a)

static

void main(string

args)

}}

也許,你看到這一段**時,你會奇怪,+=不會給delegatesand重新賦值嗎?

但是我想說你的擔心是多餘的,+=運算子,在我們之前的理解中,它具有賦值的作用,可這裡為什麼會與上邊的** 效果一樣,與你的想象不一致,其實,這裡的+=運算子被過載了 ,不再是我們一般理解的:

{int a=0,b=1;

a+=b;//此時,a變成了 1

} 在使用委託時,+=將會被過載,它的作用變成了 在不影響已賦值委託變數的前提下,為已賦值的委託變數再次新增乙個引用委託方法

也就是說,每使用一次 +=運算子,委託變數就會被加入乙個委託方法,比如原來 委託變數被賦值了,使用一次+=運算子後,委託變數也就同時作為兩個 委託方法的委託了 ,而且,它們執行的先後順序與新增的先後順序一致。

C 「委託」學習筆記

using system using system.collections.generic using system.linq using system.text namespace delegatetest console.writeline sh3 jiang 組合委託,此時委託就能夠依次執行多...

C 學習筆記 委託

什麼是委託?委託 delegate 是一種可以把引用儲存為函式的型別。委託的宣告非常類似於函式,但不帶函式體 且要使用 delegate關鍵字。委託的宣告指定了乙個型別和引數列表。在定義了乙個委託後就可以宣告該委託型別的變數。接著把這個變數初始化為與委託有相同返回型別和引數列表的函式引用。之後,就可...

C 委託學習筆記

namespace delegate private static void chinesegreeting string name 注意此方法,它接受乙個greetingdelegate型別的方法作為引數 private static void greetpeople string name,gr...