您好,登錄后才能下訂單哦!
這篇文章主要介紹了C#如何實現委托,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
我們首先來看一個非常簡單的例子:
namespace LinQ { //聲明一個委托,這個委托可以指向任何傳入兩個整數并且返回一個整數的方法 public delegate int MathOP(int i, int j); //這個類包含了MathOP將指向的方法Add class DelegateMath { public static int Add(int i, int j) { return i + j; } } class Program { static void Main(string[] args) { //創建一個指向DelegateMath.Add()的委托 MathOP o = new MathOP(DelegateMath.Add); //使用委托間接調用Add()方法 Console.WriteLine("10+20={0}",o(10,20)); //或者可以這樣,如果不清楚o.Invoke,請繼續往下看。如果您知道了,那這篇文章就可以忽略了 Console.WriteLine("10+20={0}", o.Invoke(10, 20)); Console.ReadLine(); } } }
運行結果是:
由這個簡單的例子可見委托的使用非常簡單,如果要將目標對象方法插入指定委托,只要向委托的構造函數傳入方法名即可,當然這個方法要與定義這個委托時的返回值,參數類型以及個數都完全一樣。這是我們就可以使用類似直接函數調用的語法來調用指向的成員:DelegateMath.Add(int i,int j);
我們接著深入的討論一下這個委托。東西嘛,不能光看表面,尤其是社會上的淫。不多說,"深入"之,先看一副圖:
這是一個反編譯工具經過反編譯之后出來的結果,主要看中間選中的那個LinQ.MathOP,這是我們定義的委托,它是一個類,但是我們并沒有為這個類添加了那么多的不知道從哪里來的方法啊。其實當C#編譯器處理委托類型時,它會先自動生成一個派生自System.MulticastDelegate的密封類。這個類與它的基類:System.Delegate一起為委托提供必要的基礎設施。可以看到生成的MathOP類定義了三個公共方法。Invoke應該是核心方法,因為它被用來以同步的方式調用委托類型維護的每個方法,這里所謂的同步就是指調用者必須等待調用完成才能繼續進行。BeginInvoke()和EndInvoke()方法能在第二個執行線程上異步調用當前的方法,這兩個方法主要用在多線程上面,現在大家只要知道有這么個東西就行了,以后的博文會有持續的說明。 LinQ.MathOP的偽代碼應該是這樣的:
sealed class MathOP:System.MulticastDelegate { public MathOP(object target,uint functionAddress); public int Invoke(int i,int j); public IAsyncResult BeginInvoke(int i,int j,AsyncCallback cb,object state); public int EndInvoke(IAsyncResult result); }
最后說明一下,委托還可以指向任意數量的out或ref參數(以及用params關鍵字標記的數組)的方法。如果包含了out或者ref參數,Invoke()以及BeginInvoke()方法的簽名是一樣的,但是EndInvoke()方法稍有變化,其中包括了委托類型定義的所有out或ref參數,當然,這個不需要我們的關心。
感謝你能夠認真閱讀完這篇文章,希望小編分享的“C#如何實現委托”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。