什麼是委派呢?簡單來說就是允許將方法當作參數進行傳遞。
這篇的重點將放在委派類型(Delegate)的重要知識點。
- 委派類型是一種參考類型,它的變數可以引用著一個物件,或是null值。這點和一般類別類型是一樣的。
- 委派類型物件用來包裹「簽章」匹配的方法。
- 委派類型的使用時機,在程式中扮演著間接叫用方法(Method)的功能,當一段程式碼中的上下文所需叫用的方法,不是固定的、是需要變動,或靈活性地替換叫用的方法,那麼使用委派類型是最好的選擇。
適時的善用Delegate能讓程式的耦合性降低,提升靈活性。
- 宣告委派類型的方式,與宣告方法相似,必須提供「簽章」(回傳值型別、型別參數與數目)。
//宣告委派類型
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
}
}
//回傳值型別int、(型別參數int)*2個
delegate int MyDele(int x, int y);
}
- 委派類型物件可以封裝一個或多個方法,稱為單點傳送委派、合併委派Multicast Delegate(多點傳送委派)。
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
//單點傳送委派
MyDele dele = new MyDele(Calaulator.Add);//封裝
//叫用 委派物件封裝的方法,類似叫用一般方法的方式
int res = dele(100, 200);
//多點傳送委派(合併委派)
dele += (new Calaulator()).Sub;//封裝
int res2 = dele(200, 100);//叫用
Console.WriteLine(res);
Console.WriteLine(res2);
}
}
class Calaulator
{
public static int Add(int a, int b)//靜態
{
return a + b;
}
public int Sub(int a, int b)//非靜態
{
return a - b;
}
}
delegate int MyDele(int x, int y);
}
輸出結果:
300
100
- 泛型委派在.net framework的預設裡分為兩大類:第一類 回傳值為void且帶一個或多個參數的委派Action,第二類 回傳值非void且帶一個或多個參數的委派Func。
例子:第一類 回傳值為void且帶2個參數的委派Action
class Program
{
static void Main(string[] args)
{
Action<string, int> action = new Action<string, int>(SayHello);
action("Lucy", 3);
}
static void SayHello(string name,int round)
{
for (int i = 0; i < round; i++)
{
Console.WriteLine($"Hello,{name}!");
}
}
}
輸出結果:
Hello,Lucy!
Hello,Lucy!
Hello,Lucy!
例子:第二類 回傳值類型不為void且帶2個參數的委派Func
class Program
{
static void Main(string[] args)
{
//使用Func有回傳值的泛型委派
//包裹方法
var func = new Func<int, int, int>(Calculator.Add);
//叫用方法
int res = func(100, 200);
Console.WriteLine(res);
var func1 = new Func<double, double, double>((new Calculator()).Mul);
double result = func1(5.0, 4.0);
Console.WriteLine(result);
}
}
class Calculator
{
public static int Add(int a, int b)
{
return a + b;
}
public double Mul(double a, double b)
{
return a * b;
}
}
輸出結果:
300
20
如有敘述錯誤,還請不吝嗇留言指教,thanks!