委託是一種定義方法簽名的型別。 當例項化委託時,您可以將其實例與任何具有相容簽名的方法相關聯。 您可以通過委託例項呼叫方法。
在表面上,委託很簡單,使用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);invoke是怎麼實現的呢,檢視中間**如下class program
static void showname(string name)
}
.method public hidebysig newslot virtualruntime managed 表示此方法執行時有clr處理,我推測類似於instance void invoke(string name) runtime managed
// end of method hellocallback::invoke
delegate delegates = helloshow.getinvocationlist();4、委託鏈for (int i = 0; i < delegates.length; i++)
);}
委託鏈是委託物件的集合,利用它,可以呼叫委託的所有方法
delegate有兩個公共屬性
target
獲取類例項,當前委託將對其呼叫例項方法。(靜態方法訪問空)
method
獲取委託所表示的方法。
多播委託的使用如下
namespace delegatedemo檢視multicastdelegate原始碼可知,委託鏈儲存在private object _invocationlist;public static void showchname(string name)
public static void showname(string name)}}
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...