詳解C#委託和事件(二)
當我們使用關鍵字delegate宣告一個自定義委託型別時,實際上是聲明瞭一個該名稱的類型別,繼承自抽象類System.MulticastDelegate,還包含例項方法Invoke、BeginInvoke、EndInvoke:
public delegate void MyDelegate();
其中的建構函式中第二個引數是native int型別的,這個是什麼呢?我們接著看:
我們知道在C#中任何方法都可以直接賦值給簽名一致的委託例項,這個過程看似並不合理,按理來說C#中不支援直接獲取函式的指標,其實這裡是由編譯器進行了取址操作,檢視IL程式碼可知:
MyDelegate myDelegate = myObj.MyFunc;
可以看到這裡呼叫了ldftn命令將例項方法MyFunc()的native int型別的非託管指標推到棧中,從而將該方法的指標傳到委託的建構函式中;
由於上面的建構函式存在C#中不支援的函式指標型別void(),所以不能在執行時使用Activator類中的方法建立委託例項,但在委託基類Delegate中存在靜態方法CreateDelegate()呼叫非託管程式碼用於動態建立委託例項:
Type delegateType = typeof(MyDelegate);//這裡以可訪問到的委託型別舉例 Delegate @delegate = Delegate.CreateDelegate(delegateType, myObj, "MyFunc"); //@delegate = typeof(MyClass).GetMethod("MyFunc").CreateDelegate(delegateType, myObj); //新增其它委託例項 @delegate = Delegate.Combine(@delegate, otherDelegate); //呼叫委託 @delegate.DynamicInvoke(); //當指定的委託型別可訪問時,可以將委託例項顯式轉換為指定的委託型別後使用()或Invoke()正常呼叫 //MyDelegate myDelegate = @delegate as MyDelegate; //myDelegate();
如果您覺得閱讀本文對您有幫助,請點一下“推薦”按鈕,您的認可是我寫作的最大動力!
作者:Minotauros
出處: ofollow,noindex">https://www.cnblogs.com/minotauros/
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連線,否則保留追究法律責任的權利。