程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#中Action和Func的使用,

C#中Action和Func的使用,

編輯:C#入門知識

C#中Action和Func的使用,


在日常使用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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved