委託

一、委託的使用數組

能夠自定義委託,也能夠使用.net 內置的委託函數

二、委託的實質this

經過ILDasm查看IL代碼,可知,委託是System.MulticastDelegate的派生類.net

主要是四個函數:對象

構造器 SampleDelegate(object object,IntPtr method)開發

公共函數:Invoke,BeginInvoke和EndInvokeget

委託主要能夠包裝兩類函數:靜態的函數,實例的函數io

委託對函數的包裝能夠簡單敘述爲爲委託對象設置要包裝的函數所屬的實例和要包裝的函數asm

委託有三個非公共的重要字段:System.Object 類型的_target字段 ,System.IntPtr類型的_methodPtr和ast

System.Object 類型的_invocationList。

_target:若是要包裝的是一個靜態方法,則此字段爲null,非靜態函數則爲要包裝的方法的當前實例,簡單理解就是this;

_methodPtr:一個內部的整數值,CLR用它標識要包裝的方法函數

_invocationList:一般爲null,構造委託鏈時,表示委託列表

這些值的設置在構造新的委託時,CLR進行設置,開發者基本不用幹預;

三、委託鏈

委託鏈其實並非一條鏈,而是一個列表或者數組

委託鏈又能夠稱多播委託,爲一個委託添加另外一個委託能夠使用Delegate.Combine()方法,其內部實現過程爲:每次添加一個委託都會生成一個新的委託對象,用已有的委託引用初始化_invocationList的數組,最後將最初的委託引用設置爲新委託對象的引用。顯示可知,委託對象Invoke 的執行實際上是執行一個_invocationList數組的遍歷,執行數組中全部的方法。

相關文章
相關標籤/搜索