委託學習總結(一)淺談對C#委託理解

初入社會,對於我這個初級程序員來講要學的東西實在太多了,公司最近在作一個winform框架開發的桌面應用程序,衆所周知,winform也好,webform也好,裏面隨處可見的事件驅動,有事件,固然也少不了委託,感受以前對委託這個概念的理解一直是模模糊糊的,口裏都會背的那麼幾句話:「委託能夠把方法看成參數在另外一個方法中傳遞和調用」,「委託是方法的快捷方式」等等。可是真要深刻理解,靈活運用,仍是要有良好的代碼理解功底和麪向對象基礎的,今天就再來把委託這個知識梳理梳理,以加深對它的理解。程序員

要理解委託,咱們首先要知道委託的概念:web

」委託是一個類,它定義了方法的類型,使得能夠將方法看成另外一個方法的參數來進行傳遞,這種將方法動態地賦給參數的作法,能夠避免在程序中大量使用If-Else(Switch)語句,同時使得程序具備更好的可擴展性。「編程

這是百度上和許多教科書上都有的一個概念,可是初學這門編程語言的話,或者基礎比較差的童鞋,看到這句話,確定是一臉懵比,先不用着急,咱們來慢慢經過代碼去理解委託這個概念框架

(1)首先新建一個控制檯程序,對於初學者而言,控制檯程序是學習基礎知識的最好工具編程語言

//delegate void EvenHandler(object sender, EventArgs e);
    public delegate void MyDel();//自定義一個委託
    class Program
    {
        static void Main(string[] args)
        {
            //(1)簡單委託
            MyDel say1 = SayHi;
            MyDel say2 = new MyDel(SayHi);
            say1();
            say2();
        }
        static void SayHi()
        {
            Console.WriteLine("Hi World");
        }
    }

這是最簡單的委託實例了,委託能夠經過上面say1和say2兩種方式進行調用,這裏咱們要知道委託也是一種類型,因此它和類是同級的,能夠經過委託來掉用方法,不要誤覺得委託和方法同級的,方法只是類的成員,還有定義委託和與之對應的方法必須具備相同的方法簽名,即參數個數,類型相同,返回值類型相同,上面代碼實例沒有什麼實際意義,只是然咱們知道委託的結構以及委託與方法的關係ide

(2)委託的擴展工具

//自定義一個委託
        public delegate int Expression(int a, int b);
        class Program
        {
            static void Main(string[] args)
            {
                //(2)委託擴展
                //Expression ex = GetEX;
                //Calculate(ex, 25, 10);
                Calculate(GetAdd, 25, 10);
            }
            static int Add(int a, int b)
            {
                return a + b;
            }
            static int Divide(int a, int b)
            {
                return a / b;
            }
            static int subtract(int a, int b)
            {
                return a - b;
            }
            static int multiply(int a, int b)
            {
                return a * b;
            }
            static int GetAdd(int a, int b)
            {
                return a + b;
            }
            static void Calculate(Expression ex, int a, int b)
            {
                Console.WriteLine(ex(a, b) + "\n");
            }
        }

和以前比,稍微把代碼複雜了那麼一點點,上面咱們真正實現了「把方法看成參數在另外一個方法中傳遞或調用」,實現了一個簡單的加法方法,固然咱們也寫了減法,乘法,除法的方法。你會想這樣寫有什麼好處呢?我直接調用本身的加減乘除方法不就完了嗎,何須要畫蛇添足,經過委託來折騰一番呢?委託的意義何在呢?在這裏請先聽我先說一種思想:「上面的Calculate方法裏面代碼比較少,只有一個簡單的輸出語句,並且咱們只想單純的實現一個簡單加減乘除效果,因此你會感受有點屢次一舉,也能夠說原本就是屢次一舉,可是你能夠設想一下,假如咱們這幾個加減乘除方法,它的代碼量很是龐大,可是這幾個方法的代碼類似度又很是高,可是每一個方法裏就只有一兩個小小的語句塊兒不同,那不是會讓你以爲很不爽,很想把它們整合,那怎麼處理呢?你可能首先會想經過if,else if或者switch語句對不一樣部分的代碼塊作不一樣的處理,如今我只須要作加減乘除四個case,這個思路暫且能夠接受,那未來我又要加餘數運算,平方運算,指數對數運算等等,假設我幾百個甚至更多個這樣相似的方法呢,那我豈不是要寫幾百個if,else,這樣作很明顯程序的擴展性會不好。因此咱們要換個思路,咱們徹底能夠經過一個方法把相同的部分封裝起來,而不一樣的部分經過參數傳過去,可是方法並不能直接被看成參數被傳遞和調用,那怎麼辦呢?,那麼這時候委託的做用就體現出來了,咱們能夠把委託做爲參數傳遞給封裝好了的方法,經過委託來動態的調用方法。」  結合我所說的思想,那麼上面封裝的部分就相似與咱們的Calculate方法,而不一樣的部分就是每一個加減乘除方法,你能夠假設Calculate是一個很是龐大的已經封裝好了的方法,而咱們傳進去的只是這個方法須要動態改變的部分,這樣就是最上面概念所謂的「方法動態地賦給參數」,這樣寫到好處是大大提高了方法的靈活性與擴展性,也減小了代碼的冗餘,因此委託在實際項目中是一個十分有用的工具,它可使你的代碼更加的」溫馨,健壯「。是否是感受對委託的理解有那麼一丟丟長進了,以後我還會繼續寫關於學習匿名方法,lambda表達式,泛型委託,以及事件的相關學習心得。以上言論是我本身參考資料,和項目實戰後本身作出的總結,若是又什麼不對的地方,但願各位大神指出^^。學習

相關文章
相關標籤/搜索