什么是委托?
委托(delegate)是一種托管方法的數據結構,它是一種引用類型,是對方法的引用。如果說int,string等是對數據類型的定義,那么委托就類似於對“方法類型”的定義,聲明一個委托,就是聲明一種方法簽名,只要是和聲明委托方法簽名相同的方法,都可以被委托實例托管。那為什么叫委托呢,這個名字似乎看似和它的職責不相干,但其實這是很“面向對象”的稱呼,一個方法自己辦不到的事情,去讓另一個方法幫他做,這兩者之間的關系不就是委托嗎,這樣的抽象關系不就是面向對象的一部分嗎。
如何聲明一個委托?
委托的關鍵字是delegate ,由它開頭,后邊接返回值類型,委托名稱以及參數具體如下:
delegate 返回值類型 委托名稱 (方法參數)
如何使用委托?
聲明一種委托類型,就像聲明類一樣,我們使用的時候需要先實例化,然后通過構造傳參或者“+=”的方法為委托實例添加托管方法,委托可以托管多個方法。
首先,你要確保要添加的方法,是符合委托類型的,也就是方法簽名要一致。判斷方法簽名是否一致的兩個要素就是:返回值類型,參數類型、參數數量,這幾項都要一一對應。
上方有三個測試方法,分別是無參數無返回值,有參,有返回值的方法。下面通過代碼來體現委托的用法:
class Program { delegate void NoReturnNoArgsDele(); delegate int HasReturnNoArgsDele(); delegate int HasReturnAndArgsDele(int arg); static void Main(string[] args) { DelegateTest delegateTest = new DelegateTest(); //實例化委托,並通過構造器傳入要委托的方法 NoReturnNoArgsDele noReturnNoArgs = new NoReturnNoArgsDele(delegateTest.NoReturnNoArgs); HasReturnNoArgsDele hasReturnNoArgs = new HasReturnNoArgsDele(delegateTest.HasReturnNoArgs); //委托內部重載了+= 和-=運算符,可以通過這兩個運算符為委托對象添加或移除方法 hasReturnNoArgs+= delegateTest.HasReturnNoArgs; HasReturnAndArgsDele hasReturnAndArgs = new HasReturnAndArgsDele(delegateTest.HasReturnAndArgs); Console.WriteLine("Hello World!"); } }
聲明了委托,那如何使用呢?委托的使用跟方法的調用一致:
另外,我們如果為委托實例添加多個方法,在調用委托時,就會根據添加順序依次調用,這種通過委托一次性調用多個方法的過程,稱作委托的多播。注意,如果如果是有返回值得委托,執行多播以后,委托的返回值是最后添加的方法的返回值。
Action和Func泛型委托
Action和Func泛型委托是微軟為我們實現定義好的兩組委托,這兩組委托,足以滿足我們的日常使用,而無需自己去定義委托。
先來了解一下它們的定義,
他們都是處於System命名空間下。
Func委托,它托管有返回值的方法,它的構造方法的重載有17個之多,也就是說,你可以用它匹配最多有16個參數的帶有返回值的方法,這足以滿足絕大多數我們使用委托的情景。
Action委托,它托管沒有返回值的方法,同func委托一樣,它可以最多匹配16個參數的無返回值方法。
由此,以上我們自定義的委托就可以換為以下代碼:
把參數類型或者返回值類型(如果需要它們)寫在尖括號中,它的實現原理是泛型,如果不明白泛型,請留意后期的文章。
委托在方法參數中的應用
如果你想實現方法的多樣化定制,使用委托作為參數是必不可少的。
想通過一個方法實現不同的操作,可以動態的去改變代碼邏輯,這就需要使用委托,用方法封裝一些固定的邏輯,用委托方法寫不同的代碼邏輯,去實現多樣化的需求,這就是委托的魅力所在。
個人公眾號:DotNet 致知 ,願我們一同進步。