分分搞懂c#中的委托


分分搞懂c#中的委托;

不說廢話,不來虛的概念,不管代碼是否有意義,看我的優化之路,你會理解委托了;

源代碼1

public class test
    {
        //我們不管代碼是否有意義,我們直接看代碼重構和一步步優化的過程
        int flage = 1;
        public void show(int a)
        {
            if (flage == 1)
            {
                do1(a);
            }
            else if (flage == 2)
            {
                do2(a);
            }
            else if (flage == 3)
            {
                do3(a);
            }
            else if (flage == 4)
            {
                do4(a);
            }
            else
            {

            }

        }

        public void do1(int val)
        {
        }
        public void do2(int val)
        {

        }
        public void do3(int val)
        {

        }
        public void do4(int val)
        {

        }


    }

 優化一:

public enum flag
    {
        a = 1,
        b = 2,
        c = 3,
        d = 4
    }

    public class test2
    {
public void show(int a, flag f)
        {
            switch (f)
            {
                case flag.a:
                    do1(a);
                    break;
                case flag.b:
                    do2(a);
                    break;
                case flag.c:
                    do3(a);
                    break;
                case flag.d:
                    do4(a);
                    break;
            }
        }

        public void do1(int val)
        {
        }
        public void do2(int val)
        {

        }
        public void do3(int val)
        {

        }
        public void do4(int val)
        {

        }


    }

優化二(委托“現身了”)

public delegate void mydelegate(int val);
    public class test3
    {
        public void show(int a,mydelegate de )
        {
            de(a);
        }

        public void do1(int val)
        {
        }
        public void do2(int val)
        {

        }
        public void do3(int val)
        {

        }
        public void do4(int val)
        {

        }


    }

    class Program
    {
        static void Main(string[] args)
        {
            test3 t = new test3();
            t.show(12,t.do2);
        }
    }
}

哈哈哈,這下明白了撒!(我們將方法名,當成了一個參數來傳遞滴呀~)

現在我們才來總結概念!

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

 

我們也可以將方法綁定到委托上滴呀;

還是直接上代碼:

namespace Delegate003
{
    public delegate void myDelegate(string val);
    class Program
    {
        public static void show(string val,myDelegate de)
        {
            de(val);
        }
        public static void do1(string val )
        {
            Console.WriteLine("do1.."+val);
        }

        public static void do2(string val)
        {
            Console.WriteLine("do2..."+val);
        }

        public static void do3(string val)
        {
            Console.WriteLine("do3...'"+val);
        }

        static void Main(string[] args)
        {
            //使用方式一
            myDelegate de1,de2;
            string val="sth";
            de1 = do1;
            de2 = do2;
            show(val, de1);
            show(val, de2);
            Console.ReadLine();
            //使用方式二
            //可以將多個方法賦給同一個委托,或者叫將多個方法綁定到同一個委托,當調用這個委托的時候,將依次調用其所綁定的方法
            myDelegate de;
            string val2="something";
            de = do1;
            de += do2;  //使用-=就是取消綁定
            de += do3;
            show(val2, de);
            Console.ReadLine();

            //使用方式三,繞過我們的show方法,直接調用;
            myDelegate directMy;
            string directVal = "direct";
            directMy = do1;
            directMy(directVal);  //直接通過調用委托來使用滴呀; 

            //使用方式四;
            myDelegate delegate1 = new myDelegate(do1);
            string val4 = "val4";
            delegate1(val4);

            //使用方法五


        }
    }
}

 現在再來看看總結我們的概念滴呀;

使用委托可以將多個方法綁定到同一個委托變量,當調用此變量時(這里用“調用”這個詞,是因為此變量代表一個方法),可以依次調用所有綁定的方法。

 


免責聲明!

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



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