開始使用C#中的委托時,有時會很難理解它的真正的含義,在使用時就會感覺不知道怎么使用它,其實最主要的還是不大明白它的機制, 或者說它的使用場景,首先解釋下委托,字面意思就知道它就是一個代理,一個委托,它是誰的代理呢,方法的代理。看下面的代碼:
上面的代碼就是定義一個委托來表示一類方法,使用一個字符串參數並無返回的一個方法, 只要滿足這種簽名的方法都可以用PrintLine委托實現方法的間接調用。下面自定義一個委托,結果是一樣的,但是調用的方法不一樣。
至於委托的底層實現, 可以參考FrameWork的源碼,就不展開了,今天我要講得是另外一種方法用實現不用委托的這種方法,像java里面就沒有委托這個概念的,哪它是怎么實現的呢、可以通過接口來實現:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Delegate { interface Interface1 { void PrintLine(string str); } }
上面定義接口,讓不同的實現接口的類實現多態,從而可以間接去調用。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Delegate { public class Class1 : Interface1 { public void PrintLine(string str) { Console.WriteLine(str); } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Delegate { class Class2 : Interface1 { static void WriteLine(string str) { Console.WriteLine(str); } public void PrintLine(string str) { WriteLine(str + "cc"); } } }
下面是不同的類調用,從而可以實現多態,是不是類似委托:
通過接口同樣可以實現委托那樣的效果,但是卻比較麻煩,要定義接口,然后實現接口的類重寫接口方法,顯然委托比較簡潔,但是背后是微軟幫我們封裝了方法調用,實際上也就是封裝了類的實例引用和方法指針引用,如 Interface1 cls1 = new Class1();cls1.PrintLine("Test");編譯器要知道的是哪個類重寫了Interface1接口中的PrintLine方法,因為new Class1(),所以它就就只調用Class1的實例的PrintLine方法,而委托則把這個對象實例的引用封裝起來,存儲在Delegate類的的一個_target字段中,從而可以引用各種不同的對象實現,而方法存儲在另外一個_methodPtr字段中,從而可以存儲不同的方法,但是前提是方法簽名相同。然后還可以定義一個數組存儲多個委托,從而達到多播委托的效果。
不知道上面這樣解釋有沒有對你有更好的理解,歡迎補充與建議