標籤:des style blog http color io os ar 使用
- Action
- Action<T>
- Func
- Func<T>
Action:封裝一個方法,該方法不具有參數並且不傳回值
public delegate void Action()
Action<T>:Action的泛型實現了1到16個傳入參數的定義,但是仍然沒有傳回值,得出結論Action不支援傳回值,如果需要傳回值請使用另一個系統委託Func
public delegate void Action<in T>(T obj)...public delegate void Action<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>(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)
由此可見Action的定義非常簡單,但是這樣的委託實在是太常用了,如果用一次自己定義一個也是可以的,多的話就感覺重複勞動太多:
過去自訂委託:
using System;using System.Windows.Forms;public delegate void ShowValue();public class Name{ private string instanceName; public Name(string name) { this.instanceName = name; } public void DisplayToConsole() { Console.WriteLine(this.instanceName); } public void DisplayToWindow() { MessageBox.Show(this.instanceName); }}public class testTestDelegate{ public static void Main() { Name testName = new Name("Koani"); ShowValue showMethod = testName.DisplayToWindow; showMethod(); }}
View Code
現在直接使用Action:
using System;using System.Windows.Forms;public class Name{ private string instanceName; public Name(string name) { this.instanceName = name; } public void DisplayToConsole() { Console.WriteLine(this.instanceName); } public void DisplayToWindow() { MessageBox.Show(this.instanceName); }}public class testTestDelegate{ public static void Main() { Name testName = new Name("Koani"); Action showMethod = testName.DisplayToWindow; //將 Action 委託與匿名方法一起使用 // Action showMethod = delegate() { testName.DisplayToWindow();} ; //將 lambda 運算式分配給 Action 委託執行個體 //Action showMethod = () => testName.DisplayToWindow(); showMethod(); }}
View Code
Action<T>的使用也是類似的,但是 Action<T>的定義是比較特別的,它有一個關鍵詞In,In是用來幹嘛的呢,按照MSDN的解釋:
關於派生程度更小或更低的類型等相關的概念理解我推薦深入理解 C# 協變和逆變
Func:封裝一個不具有參數但卻返回 TResult 參數指定的類型值的方法
public delegate TResult Func<out TResult>()
Func<T>: Func的泛型同樣的實現了1到16個傳入參數,而且支援傳回值。
public delegate TResult Func<in T, out TResult>( T arg)...public delegate void 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)
Func的定義同樣簡單明了,和Action一樣是為了簡化代碼方便”客戶“使用:
過去自訂委託:
using System;using System.IO;delegate bool WriteMethod();public class TestDelegate{ public static void Main() { OutputTarget output = new OutputTarget(); WriteMethod methodCall = output.SendToFile; if (methodCall()) Console.WriteLine("Success!"); else Console.WriteLine("File write operation failed."); }}public class OutputTarget{ public bool SendToFile() { try { string fn = Path.GetTempFileName(); StreamWriter sw = new StreamWriter(fn); sw.WriteLine("Hello, World!"); sw.Close(); return true; } catch { return false; } }}
View Code
現在直接使用Func:
using System;using System.IO;public class TestDelegate{ public static void Main() { OutputTarget output = new OutputTarget(); Func<bool> methodCall = output.SendToFile; //Func<bool> methodCall = delegate() { return output.SendToFile(); };將 Func<TResult> 委託與匿名方法一起使用 // Func<bool> methodCall = () => output.SendToFile(); 將 lambda 運算式分配給 Func<T, TResult> 委託 if (methodCall()) Console.WriteLine("Success!"); else Console.WriteLine("File write operation failed."); }}public class OutputTarget{ public bool SendToFile() { try { string fn = Path.GetTempFileName(); StreamWriter sw = new StreamWriter(fn); sw.WriteLine("Hello, World!"); sw.Close(); return true; } catch { return false; } }}
View Code
通過定義可以看到Func的定義不僅可以看到In關鍵詞的身影,還有一個Out關鍵詞,MSDN的解釋如下(Out作為方法的輸出參數也是經常用到的):
關於派生程度更大或更高的類型等相關的概念理解我依然推薦深入理解 C# 協變和逆變
C#系統委託之Action And Func