委派(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,改執行方法4和5各二次,委派就會執行方法4和5各二次。
委派delegate再程式設計中很常會和事件event一起使用,接下來我會再寫一篇文章和大家介紹事件。
留言列表