C#中的代理

來源:互聯網
上載者:User

有些書上也稱“代表”或“委託”
C#中取消了指標的概念。對指標戀戀不捨的程式員可以有兩種解決方案:聲明“非安全”(unsafe)程式碼片段然後在其中使用指標或者使用C#的一個參考型別——“代理”(delegate)。“代理”相當與C中的函數指標原型,區別是C#是型別安全的。

“代理”(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.