委託的延伸 - 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裡, 在未來多執行緒的執行上也可以有效地應用上。

1 次瀏覽

最新文章

查看全部

委託(delegate)和事件(event)

委託 C#的方法有重載(overload)的特性,可以在同一個方法名稱底下有不同的參數數目以及類型。 那麼如果參數一樣, 但有不同的方法名稱, 應該怎麼實現? 就是委託 static void Main(string[] args) { int x = 1; int y = 2; Calculate(x, y, Method.Add); Console.ReadKey(); }

Program, Process, Thread 介紹

Program就像是原始碼 , 在IDE編輯修改但還沒執行的程式 Process就像是一個獨立空間, 把各種電腦的實體資源占用下來, 留給程式來執行 Thread就像是執行任務的子空間, 乘載著Process裡頭各種任務 可以得知, 多個Process資源不共用, 而一個Process裡頭可以有很多個Thread, 這些Thread可以共用Process空間裡的資源, 同時這些Thread間也可以

陣列Array的操作

陣列(Array)是程式語言中最常用的的數據類型之一, 由於 C#語言是Managed程式碼(統一由Common Language Runtime管理維護), 因此在C#使用陣列的時候, 用戶不需要考慮記憶體地址、資源開啟/關閉、越界檢查等底層工作, 就像是使用另一種數據格式一樣簡單。 此篇文章介紹了陣列的使用方法, 以及常用的操作, 最後介紹一個簡儀科技提供的dll工具 - SeeSharpTo

©JYTEK Taiwan 2019