top of page
作家相片JYTEK Taiwan

委託的延伸 - Action 和Func

如之前所提到的, 委託是將方法作為參數傳遞給其他的物件使用, 大幅增加物件的擴充性以及程式的維護性。而同時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裡, 在未來多執行緒的執行上也可以有效地應用上。

23 次查看0 則留言

最新文章

查看全部

Comentarios


bottom of page