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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

委托内部

發布時間:2023/12/18 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 委托内部 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

當聲明一個委托,如下:

delegate void Feedback(int value);

編譯器實際上定義了如下一個類:

//所有創建的委托都繼承自 MulticastDelegate 類//而 MulticastDelegate 類繼承自 Delegateclass Feedback : MulticastDelegate{//從 MulticastDelegate 類繼承的 Delegate 類繼承而來//當委托對象包裝的是一個靜態方法時,該字段存儲的是null;包裝的是實例方法時,存儲的是回調方法要操作的對象的引用.object _target;//從 MulticastDelegate 類繼承的 Delegate 類繼承而來//一個內部的整數值,CLR用它表示要回調的方法//這個內部的整數值從 MethodDef 或者 MemberRef 元數據 token 獲得 IntPtr _methodPtr;//從 MulticastDelegate 類繼承而來//該字段通常為null,當構造委托鏈時,它引用了一個委托數組object _invocationList;//構造方法public Feedback(object @object, IntPtr method){this._target = @object;this._methodPtr = method;}//這個方法的參數,返回值和定義的委托的參數,返回值一模一樣public virtual void Invoke(int value) { ...}//下面兩個方法實現對回調方法的異步回調public virtual IAsyncResult BeginInvoke(int value,AsyncCallback callback,object @object) { ...}public virtual void EndInvoke(IAsyncResult result) { ...}}

?

?

?

//Invoke方法的偽代碼:public virtual void Invoke(int value){Delegate[] delegateSet = _invocationList as Delegate[];if (delegateSet != null){foreach (var d in delegateSet){d(value);}}//==null 表示 不是委托鏈else{//這行代碼接近實際的代碼 _methodPtr.Invoke(_target, value);}}

?

刪除委托:

?

委托鏈不足的地方:

1.除了最后一個返回值,其他所有回調方法的返回值都會被丟棄;

2.如果被調用的委托中有一個拋出了異常或者阻塞了很長一段時間,那么后續的所有委托都調用不了.

?

轉載于:https://www.cnblogs.com/refuge/p/8953908.html

總結

以上是生活随笔為你收集整理的委托内部的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。