日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > C# >内容正文

C#

C#中的代理(Delegate)

發(fā)布時間:2024/9/20 C# 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C#中的代理(Delegate) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
C#代理實際上類似于C++中的函數(shù)指針,因為C#中不存在指針,所以用代理可以完成一些原來在C++中用函數(shù)指針完成的操作,例如傳遞一個類A的方法m給另一個類B的對象,使得類B的對象能夠調(diào)用這個方法m。但與函數(shù)指針相比,delegate有許多函數(shù)指針不具備的優(yōu)點。首先,函數(shù)指針只能指向靜態(tài)函數(shù),而delegate既可以引用靜態(tài)函數(shù),又可以引用非靜態(tài)成員函數(shù)。在引用非靜態(tài)成員函數(shù)時,delegate不但保存了對此函數(shù)入口指針的引用,而且還保存了調(diào)用此函數(shù)的類實例的引用。其次,與函數(shù)指針相比,delegate是面向?qū)ο蟆㈩愋桶踩⒖煽康氖芸?#xff08;managed)對象。也就是說,runtime能夠保證delegate指向一個有效的方法,你無須擔(dān)心delegate會指向無效地址或者越界地址。?

????實現(xiàn)一個delegate是很簡單的,通過以下3個步驟即可實現(xiàn)一個delegate:
1. 聲明一個delegate對象,它應(yīng)當(dāng)與你想要傳遞的方法具有相同的參數(shù)和返回值類型。?
??? 聲明一個代理的例子:
??? public delegate int MyDelegate(string message);

2. 創(chuàng)建delegate對象,并將你想要傳遞的函數(shù)作為參數(shù)傳入。?
???? 創(chuàng)建代理對象的方法:
??? 1). MyDelegate myDelegate = new MyDelegate(實例名.方法名);
??? 2). MyDelegate myDelegate = new MyDelegate(類名.方法名);
注:如果需要代理的方法是一個static靜態(tài)方法的話,采用第2種方式,否則采用第1種方式。

3. 在要實現(xiàn)異步調(diào)用的地方,通過上一步創(chuàng)建的對象來調(diào)用方法。?
??? 可以直接使用代理調(diào)用代理所指向的方法:
????myDelegate(向方法傳遞的參數(shù));

????下面是一些需要注意的事情:
“代理”(delegate)(代表、委托):“代理”是類型安全的并且完全面向?qū)ο蟮摹?br />1)在C#中,所有的代理都是從System.Delegate類派生的(delegateSystem.Delegate的別名)。
2)代理隱含具有sealed
屬性,即不能用來派生新的類型。
3
)代理最大的作用就是為類的事件綁定事件處理程序。
4)在通過代理調(diào)用函數(shù)前,必須先檢查代理是否為空(null),若非空,才能調(diào)用函數(shù)。5
)在代理實例中可以封裝靜態(tài)的方法也可以封裝實例方法。
6)在創(chuàng)建代理實例時,需要傳遞將要映射的方法或其他代理實例以指明代理將要封裝的函數(shù)原型(.NET中稱為方法簽名:signature)。注意,如果映射的是靜態(tài)方法,傳遞的參數(shù)應(yīng)該是類名.方法名,如果映射的是實例方法,傳遞的參數(shù)應(yīng)該是實例名.
方法名。
7
)只有當(dāng)兩個代理實例所映射的方法以及該方法所屬的對象都相同時,才認為它們是想等的(從函數(shù)地址考慮)。
8)多個代理實例可以形成一個代理鏈,System.Delegate中定義了用來維護代理鏈的靜態(tài)方法CombionRemove
,分別向代理鏈中添加代理實例和刪除代理實例。
9)代理的定義必須放在任何類的外面,如delegate int MyDelegate();而在類的方法中調(diào)用MyDelegate d = new MyDelegate(MyClass.MyMethod)
;來實例化自定義代理的實例。
10
)代理三步曲:
a.生成自定義代理類:
delegate int MyDelegate();
b.然后實例化代理類:MyDelegate d = new MyDelegate(MyClass.MyMethod);
c.最后通過實例對象調(diào)用方法:int ret = d();
?

轉(zhuǎn)載于:https://www.cnblogs.com/9who/archive/2008/07/28/1254617.html

總結(jié)

以上是生活随笔為你收集整理的C#中的代理(Delegate)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。