如之前所提到的, 委託是將方法作為參數傳遞給其他的物件使用, 大幅增加物件的擴充性以及程式的維護性。而同時C#也進一步提供了兩個好用的類別作為委託的延伸應用, 分別是Action和Func
Action類別接受單一泛型物件作為參數, 並且沒有返回值, 如果用戶需要有多個參數或是需要返回值的話, 則可以使用Func類別, Func類別最多可以支援到16個輸入類別和一個返回類別。可以參考以下微軟C#的說明
Action 類別
public delegate void Action<in T>(T obj);
Func 類別
public delegate TResult Func<out TResult>();
public delegate TResult Func<in T,out TResult>(T arg);
public delegate TResult Func<in T1,in T2,out TResult>(T1 arg1, T2 arg2);
…
public delegate TResult Func<in T1,in T2,in T3,in T4,in T5,in T6,in T7,in T8,in T9,in T10,in T11,in T12,in T13,in T14,in T15,in T16,out TResult>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14, T15 arg15, T16 arg16);
以下是範例程式碼
static void Main(string[] args)
{
string text = "Hello";
Action<string> act = new Action<string>(Print);
act.Invoke(text);
//print "Hello" on the screen
Func<string, int> func = new Func<string, int>(TextLength);
var len=func.Invoke(text);
Console.WriteLine(len);
//print "5" on the screen
Console.ReadKey();
}
private static void Print(string text)
{
Console.WriteLine(text);
}
private static int TextLength(string text)
{
return text.Length;
}
在範例中, Action負責將文字輸出在Console上, 而Func則負責計算文字的長度並返回。由於已經將執行的方法封裝進Action跟Func裡, 在未來多執行緒的執行上也可以有效地應用上。
Comentarios