在日常使用delegate時,我們通常需要顯示聲明一個名為XXX的委托,而在使用Action委托時,不必顯示定義一個封裝無參數過程的委托。
比如正常使用delegate:
1 using System;
2
3 namespace MT
4 {
5 public delegate void ShowValue();//在這裡顯示聲明一個委托
6
7 public class Test
8 {
9 //在這裡有一個Test類,類中有一個void的方法,作用是輸出一個字符串
10 private string instanceName;
11 public Test(string name)
12 {
13 this.instanceName = name;
14 }
15 public void DisplayToConsole()
16 {
17 Console.WriteLine(this.instanceName);
18 }
19 }
20
21 public class Program
22 {
23 //在Main函數裡使用委托去調用這個方法
24 static void Main(string[] args)
25 {
26 Test name = new Test("Sirius");
27 ShowValue method = name.DisplayToConsole;
28 method();
29 Console.ReadKey();
30 }
31 }
32 }
Action就是這麼個姿勢:
1 static void Main(string[] args)
2 {
3 Test name = new Test("Sirius");
4 Action method = name.DisplayToConsole;
5 method();
6 Console.ReadKey();
7 }
當然,Action也可以有簽名模板,Action<T>。
public void DisplayToConsole(string name)
{
Console.WriteLine(name);
}
Action<string> method2 = name.DisplayToConsole;
method2("123");
Console.ReadKey();
說到Func,其實跟Action的區別就是,Func代理的方法必須有返回值,因為Func的重載模式是Func<T1,T2....TResult>,T幾代表代理的方法的模板,也就是可以傳入的參數,TResult就是代理方法的返回值。
比如,我們把上面的DisplayToConsole方法稍作修改,改為DisplayForFunc:
1 public void DisplayForFunc(string name)
2 {
3 Console.WriteLine(name);
4 }
這個時候使用Func委托時不行的
Func<string, object> f = t.DisplayForFunc;
會被告知返回類型錯誤,Func所適應的代理則應該是具有返回值類型的,我們再修改一下方法,讓它返回一個無意義的bool值:
1 public bool DisplayForFunc(string name)
2 {
3 Console.WriteLine(name);
4 return true;
5 }
1 static void Main(string[] args)
2 {
3 Test t = new Test("Sirius");
4 Func<string, bool> f = t.DisplayForFunc;
5 f("123");
6 Console.ReadKey();
7 }
這樣就是可以的啦!
順便貼一張MSDN的牛逼圖,這是我第一次看MSDN看到想笑……

代碼參考:https://msdn.microsoft.com/zh-cn/library/system.action(v=vs.110).aspx