首頁 » C#學習 » 委派(Delegate)

委派(Delegate)

作者:

分類:

何謂委派?

委派(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!!

參考資料

「cian」的個人頭像

留言

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *