C#中的代理(Delegate)

來源:互聯網
上載者:User

    在學習多線程的過程中,又遇到了一個問題:C#代理.上網查了些資料,對代理有了一個初步的認識,記一點筆記.

    C#代理實際上類似於C++中的函數指標,因為C#中不存在指標,所以用代理可以完成一些原來在C++中用函數指標完成的操作,例如傳遞一個類A的方法m給另一個類B的對象,使得類B的對象能夠調用這個方法m。但與函數指標相比,delegate有許多函數指標不具備的優點。首先,函數指標只能指向靜態函數,而delegate既可以引用靜態函數,又可以引用非靜態成員函數。在引用非靜態成員函數時,delegate不但儲存了對此函數入口指標的引用,而且還儲存了調用此函數的類執行個體的引用。其次,與函數指標相比,delegate是物件導向、型別安全、可靠的受控(managed)對象。也就是說,runtime能夠保證delegate指向一個有效方法,你無須擔心delegate會指向無效地址或者越界地址。 

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

2. 建立delegate對象,並將你想要傳遞的函數作為參數傳入。 
     建立代理對象的方法:
    1). MyDelegate myDelegate = new MyDelegate(執行個體名.方法名);
    2). MyDelegate myDelegate = new MyDelegate(類名.方法名);
註:如果需要代理的方法是一個static靜態方法的話,採用第2種方式,否則採用第1種方式。

3. 在要實現非同步呼叫的地方,通過上一步建立的對象來調用方法。 
    可以直接使用代理調用代理所指向的方法:
    myDelegate(向方法傳遞的參數);

    下面是一些需要注意的事情:
“代理”(delegate)(代表、委託):“代理”是型別安全的並且完全物件導向的。
(1)在C#中,所有的代理都是從System.Delegate類派生的(delegate是System.Delegate的別名)。
(2)代理隱含具有sealed屬性,即不能用來派生新的類型。
(3)代理最大的作用就是為類的事件綁定事件處理常式。
(4)在通過代理調用函數前,必須先檢查代理是否為空白(null),若非空,才能調用函數。(5)在代理執行個體中可以封裝靜態方法也可以封裝執行個體方法。
(6)在建立代理執行個體時,需要傳遞將要映射的方法或其他代理執行個體以指明代理將要封裝的函數原型(.NET中稱為方法簽名:signature)。注意,如果映射的是靜態方法,傳遞的參數應該是類名.方法名,如果映射的是執行個體方法,傳遞的參數應該是執行個體名.方法名。
(7)只有當兩個代理執行個體所映射的方法以及該方法所屬的對象都相同時,才認為它們是想等的(從函數地址考慮)。
(8)多個代理執行個體可以形成一個代理鏈,System.Delegate中定義了用來維護代理鏈的靜態方法Combion,Remove,分別向代理鏈中添加代理執行個體和刪除代理執行個體。
(9)代理的定義必須放在任何類的外面,如delegate int MyDelegate();而在類的方法中調用MyDelegate d = new MyDelegate(MyClass.MyMethod);來執行個體化自訂代理的執行個體。
(10)代理三步曲:
a.產生自訂代理類:delegate int MyDelegate();
b.然後執行個體化代理類:MyDelegate d = new MyDelegate(MyClass.MyMethod);
c.最後通過執行個體對象調用方法:int ret = d(); 

   

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.