C#中的委托(Update)


什么是委托?

委托(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 致知 ,願我們一同進步。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM