委派(Delegate)

 

    委派(Delegate)在程式設計中算比較進階的觀念,還是有很多機會用到。委派的意思是把工作派給別人去做,就好像是經紀人或是仲介的概念,把事情委託給經紀人或仲介處理。更精確地講,委派就是將方法定義為參數,指定要傳入的參數,程式中的方法交給委派來處理,而不是自己處理。

           舉一個程式的例子和大家做說明,今天我要做一個產生數字的程式如下:

 

public static int[] GetRandomNumber(int maxno,int amount)   //產生亂數的方法

        {

            Random random = new Random();

            int[] nums = new int[amount];

 

            for(int i=0;i<amount;i++)

            {

                nums[i] = random.Next(0,maxno);

            }

            return nums;

        }

 

在這裡特別說明一下Random是一個產生亂數的方法,random.Next(數字A,數字B)表示產生範圍從(數字A)(數字B-1)這個範圍的亂數,特別要注意範圍的最大數字為(數字B-1)

 

以上這個方法就可以產生自訂數量,自訂範圍內的亂數,把這一段程式丟給委派來做。

 

  public delegate int[] GenerateNumbers(int x,int y); //建立產生數字的委派

 

然後這個方法就可以呼叫GenerateNumbers這個委派來完成,要注意使用委派時要先實例化如下:

    GenerateNumbers generateRandom = new GenerateNumbers(GetRandomNumber);

 

呼叫委派來產生亂數的程式如下:

static void Main(string[] args)

{

            GenerateNumbers generateRandom = new GenerateNumbers(GetRandomNumber);

            int[] numbers= generateRandom(10, 3);//使用委派

 

            foreach (int n in numbers) //印出所有產生的數字

            {

                Console.Write(n + "\t");

            }

}

 

     像這樣就會輸出3個隨機產生的亂數,範圍從0~9

 

一個委派可以不只是只有做一個工作,可以再指派給他另一個工作,但是要注意參數格式要一致,剛才是產生亂數,而現在我要照順序產生數字,那我就可以把這個方法也丟給委派去做,如下:

 

  public static int[] GetMyNumbers(int max, int min)   //照順序產生數字的方法

        {         

            if (max < min)  //防止程式錯誤,如果max < min 時輸出0

            {

                int[] onenum = { 0 };

                return onenum;

            }

          

            int[] nums = new int[max - min + 1];

 

            for (int i = 0; i <= max-min; i++)

            {

                nums[i] = min + i;

            }

            return nums;

        }

 

static void Main(string[] args)

        {

 

          

 

            GenerateNumbers generateNum = new GenerateNumbers(GetMyNumbers);

            numbers = generateNum(10, 5);//使用委派

 

            foreach (int n in numbers) //印出所有產生的數字

            {

                Console.Write(n + "\t");

            }

        }

 

輸出結果

5        6        7        8        9        10

 

完整程式如下:

namespace DelegateRandomNumber

{

    //使用委派產生數字

    class Program

    {

        public delegate int[] GenerateNumbers(int x,int y); //建立產生數字的委派

 

        public static int[] GetRandomNumber(int maxno,int amount)   //產生亂數的方法

        {

            Random random = new Random();

            int[] nums = new int[amount];

 

            for(int i=0;i<amount;i++)

            {

                nums[i] = random.Next(0,maxno);

            }

            return nums;

        }

 

        public static int[] GetMyNumbers(int max, int min)   //照順序產生數字的方法

        {         

            if (max < min)  //防止程式錯誤,如果max < min 時輸出0

            {

                int[] onenum = { 0 };

                return onenum;

            }

          

            int[] nums = new int[max - min + 1];

 

            for (int i = 0; i <= max-min; i++)

            {

                nums[i] = min + i;

            }

            return nums;

        }

 

        static void Main(string[] args)

        {

 

            GenerateNumbers generateRandom = new GenerateNumbers(GetRandomNumber);

            int[] numbers= generateRandom(10, 3);//使用委派

 

            foreach (int n in numbers) //印出所有產生的數字

            {

                Console.Write(n + "\t");

            }

            Console.WriteLine();

 

            GenerateNumbers generateNum = new GenerateNumbers(GetMyNumbers);

            numbers = generateNum(10, 5);//使用委派

 

            foreach (int n in numbers) //印出所有產生的數字

            {

                Console.Write(n + "\t");

            }

 

            Console.ReadLine();

        }

    }

}

輸出結果

1        0        4

5        6        7        8        9        10

 

 

那這樣到底使用委派有甚麼好處呢?使用委派很重要的一個好處是一個委派可以做好幾個工作,工作內容可以增減,叫做多重委派,就像下面的程式:

//多重委派

namespace DelegateMultiCast

{

    class Program

    {

        public delegate void MyDelegate();

 

        public static void Method1()

        {

            Console.WriteLine("我是無尾熊");

        }

 

        public static void Method2()

        {

            Console.WriteLine("我是趴趴熊");

        }

 

        public static void Method3()

        {

            Console.WriteLine("我是大公雞");

        }

 

        public static void Method4()

        {

            Console.WriteLine("我是大野狼");

        }

 

        public static void Method5()

        {

            Console.WriteLine("我是小紅帽");

        }

 

        static void Main(string[] args)

        {

            MyDelegate myDelegate = new MyDelegate(Method1);

            myDelegate += new MyDelegate(Method2);

            myDelegate += new MyDelegate(Method3);          

            myDelegate();

            Console.WriteLine("--------------------------");

 

            myDelegate -= new MyDelegate(Method1);

            myDelegate -= new MyDelegate(Method2);

            myDelegate -= new MyDelegate(Method3);

            myDelegate += new MyDelegate(Method4);

            myDelegate += new MyDelegate(Method4);

            myDelegate += new MyDelegate(Method5);

            myDelegate += new MyDelegate(Method5);

            myDelegate();

            Console.ReadLine();

        }

    }

}

 

 

輸出結果

我是無尾熊

我是趴趴熊

我是大公雞

--------------------------

我是大野狼

我是大野狼

我是小紅帽

我是小紅帽

 

    就像上面的結果所看到的,委派可以執行多個方法並且自由增減,原本我只有叫委派要執行方法1~3,委派就會執行這三個方法,然後我刪掉原本委派執行方法1~3,改執行方法45各二次,委派就會執行方法45各二次。

 

    委派delegate再程式設計中很常會和事件event一起使用,接下來我會再寫一篇文章和大家介紹事件。

 

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 波羅、希夏普2020 的頭像
    波羅、希夏普2020

    希夏普2020的程式天地

    波羅、希夏普2020 發表在 痞客邦 留言(0) 人氣()