委托内部
當聲明一個委托,如下:
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
總結
- 上一篇: springMVC数据封装成POJO
- 下一篇: com组件的注册