c 委託 delegate 揭秘

2022-09-16 11:03:14 字數 2610 閱讀 6892

委託是一種定義方法簽名的型別。 當例項化委託時,您可以將其實例與任何具有相容簽名的方法相關聯。 您可以通過委託例項呼叫方法。  

在表面上,委託很簡單,使用new來構造委託例項。使用委託例項的變數名來呼叫**函式。實際情況是編譯器,clr在幕後做了大量的工作來隱藏其複雜性,只有了解了這些幕後的東西,你才能真正的掌握它、靈活的運用它。

1、宣告委託

namespace delegatedemo}}

通過ildasm檢視中間**,如下

編譯器自動生成乙個hellocallback的類,類裡面有構造方法,**方法invoke,非同步**方法(begininvoke,endinvoke),

它繼承multicastdelegate類,multicastdelegate繼承delegate類,c#有兩個委託類(delegate,multicastdelegate)是有歷史原因的,原來是要合併成乙個類,但快到發布時間了,合併它需要重新測試,所以delegate就倖存下來)。

2、委託的例項化

internal delegate void hellocallback(string name);

class program

static void showname(string name)

}

中間**如下

.method private hidebysig static void  main(string args) cil managed

// end of method program::main

從中間**我們可以看到,hellocallback類建構函式有兩個引數,hellocallback::.ctor(object,  native int),而我的**是

hellocallback helloshow = new hellocallback(showname);只有乙個引數,應該編譯不過。編譯器在這個地方幫我們做了一些東西,

當它知道要構造的是委託時,就會分析源**來確定引用的是哪個物件,那個方法。物件引用傳遞給object,showname的函式指標傳遞給native int

3、呼叫**方法

源**如下

internal delegate void hellocallback(string name);

class program

static void showname(string name)

}

中間**如下

.method private hidebysig static void  main(string args) cil managed

// end of method program::mains

helloshow("hello") 等價於 helloshow.invoke("hello");

完整的**如下

internal delegate void hellocallback(string name);

class program

static void showname(string name)

}

invoke是怎麼實現的呢,檢視中間**如下

.method public hidebysig newslot virtual 

instance void invoke(string name) runtime managed

// end of method hellocallback::invoke

runtime managed 表示此方法執行時有clr處理,我推測類似於

delegate delegates = helloshow.getinvocationlist();

for (int i = 0; i < delegates.length; i++)

);}

4、委託鏈

委託鏈是委託物件的集合,利用它,可以呼叫委託的所有方法

delegate有兩個公共屬性

target

獲取類例項,當前委託將對其呼叫例項方法。(靜態方法訪問空)

method

獲取委託所表示的方法。

多播委託的使用如下

namespace delegatedemo

public static void showchname(string name)

public static void showname(string name)}}

檢視multicastdelegate原始碼可知,委託鏈儲存在private object _invocationlist;

hellocallback helloshow = new hellocallback(showname);
_invocationlist被初始化成object,陣列的第乙個元素為new hellocallback(showname)委託

helloshow += showchname;
+使用了運算子過載,它實際呼叫的是delegate的combine,-號實際呼叫的是delegate的remove

筆記 C 委託 delegate

網上查了很多資料,發現講委託的思路很亂!於是來整理一下。1 比喻 我把委託看成是手槍上的彈匣,而需要委託的函式則是彈匣中的子彈。要打幾槍就在委託裡裝幾發子彈,然後帶上這把槍 而不是去為每把槍裝上一發子彈,然後背一大堆槍 這裡的槍就是主函式gun 子彈可能是fire ice gold 屬性 彈匣就是委...

c 委託 與多播委託delegate

委託又叫匿名函式,首先我們來說為什麼要使用委託 委託到底是什麼 舉乙個例子 我想求煉表裡少於10的數的和,getsum static int getsum listlist return sum 我又想求煉表裡所有奇數的和,那麼是否是又要寫乙個函式getsum2 來求呢 static int get...

C 中的委託 delegate

delegate,中文意為 委託 是c 中新引入的乙個概念。我個人的理解,delegate相當於c 中函式指標在oop程式設計下的封裝。delegate的用途,如同函式指標的功能一樣,是為了在類似啟動執行緒 通用庫中的高階函式 以及事件處理等場合中,把乙個方法,或者說函式,作為乙個引數來傳遞。del...