何謂委派?
委派(Delegate)在中文上有委託,委任派遣之意。
在程式語言中,委派是將方法的執行內容交由其他地方實作,自己則定義委派簽章(Method Signature),規定委託的輸入型別及回傳型別。
不論是方法來自類別還是結構,靜態還是執行個體,只要符合簽章即可加入委派的行列。
public delegate void PrintMethod(int code, string msg);
什麼是委派簽章?
委派簽章是用來定義一個方法的參數類型(type),在方法多載(overloading)的狀況下,不包含回傳類型。
但在委派時,簽章卻包含有傳回值,例如上面的 PrintMethod,加入委派的方法需要符合輸入 int、string 及回傳 void 的簽章。
如何使用委派?
相對於事件(Event),委派常用來將方法包裝成物件使用,換句話說是可以將方法透過委派物件來傳遞;也有另一種建構委派的方法,是以 Lambda 運算式做為匿名方法。
委派實例
舉例有個物件需要呼叫 PrintMethod 來輸出指令 code 及訊息 msg,但輸出風格需要由使用者決定,就可以運用委派的方式,將Print需要的資訊委給 PrintStyleA 方法。
public static void PrintStyleA(int code, string msg)
{
Console.WriteLine($"[{code}] {msg}");
}
Print print = PrintStyleA;
print(100, "System Connected!!");
//OUTPUT:[100] System Connected!!
作為參數傳遞
委派的物件可作為參數傳遞,可以透過此方式由外部設定,進階的應用可以作為回呼方法(Callback function)將處理結果返回。
public void PrintByStyle(Print print)
{
print?.Invoke(100, "System Connected!!"); //null check
}
SetPrintStyle(PrintStyleA);
//OUTPUT:[100] System Connected!!
多點傳送
委派的多點傳送,意思是可以呼叫一個以上的方法。若要將多個的方法加入委派的方法清單 (引動過程清單),只需使用加法(+)或指派運算子(+=),相加兩個委派物件即可,移除則使用減法(-)或指派運算子(-=)。
public static void PrintStyleB(int code, string msg)
{
Console.WriteLine($"Code:{code}, Message:{msg}");
}
Print print = PrintStyleA + PrintStyleB;
print(100, "System Connected!!");
//OUTPUT:[100] System Connected!!
//OUTPUT:Code:100, Message:System Connected!!
發佈留言