Action<T> 委托其實與[button url="http://redcat7.net/?p=343" style="dark"]Func<T, TResult> 委托[/button]一樣,都是為了簡化委托的使用,這兩者的不同之處在於Action<T> 封裝一個方法且該方法只有一個參數並且不返回值,而Func<T, TResult>封裝一個具有一個參數並返回 TResult 參數指定的類型值的方法。
使用 Action<T> 委托以參數形式傳遞方法,不用顯式聲明自定義的委托。 封裝的方法必須與此委托定義的方法簽名相對應。 也就是說,封裝的方法必須具有一個通過值傳遞給它的參數,並且不能返回值。 (在 C# 中,該方法必須返回 void。 在 Visual Basic 中,必須通過 Sub…End Sub 結構來定義它。 它也可以是返回已忽略的值的方法。) 通常,這種方法用於執行某個操作。
那么Action<T>是如何簡化委托調用的呢?
請先看委托傳統的使用方法:
using System; using System.Windows.Forms; delegate void DisplayMessage(string message); public class TestCustomDelegate { public static void Main() { DisplayMessage messageTarget; if (Environment.GetCommandLineArgs().Length > 1) messageTarget = ShowWindowsMessage; else messageTarget = Console.WriteLine; messageTarget("Hello, World!"); } private static void ShowWindowsMessage(string message) { MessageBox.Show(message); } }
上面的代碼顯式聲明了一個名為 DisplayMessage 的委托,並將對 WriteLine 方法或 ShowWindowsMessage 方法的引用分配給其委托實例。
以下示例簡化了此代碼,它所用的方法是實例化 Action<T> 委托,而不是顯式定義一個新委托並將命名方法分配給該委托。
using System; using System.Windows.Forms; public class TestAction1 { public static void Main() { Action<string> messageTarget; if (Environment.GetCommandLineArgs().Length > 1) messageTarget = ShowWindowsMessage; else messageTarget = Console.WriteLine; messageTarget("Hello, World!"); } private static void ShowWindowsMessage(string message) { MessageBox.Show(message); } }
由此我們可以看出,通過使用Action<T> ,我們完美避開了對委托的定義,但缺點是它只接受一個參數,好在這個參數可以是任意類型,如果我們有多個參數需要傳遞,而又不想定義委托,那么我們可以新建一個對象類來封裝我們的參數,以滿足Action<T>對參數的要求。
Action<T>除了以上用法之外,還可以通過下面兩種方法來達到相同的目的,但是沒有上面的方法簡單。
1. 我們也可以按照以下示例所演示的那樣在 C# 中將 Action<T> 委托與匿名方法一起使用。
using System; using System.Windows.Forms; public class TestAnonMethod { public static void Main() { Action<string> messageTarget; if (Environment.GetCommandLineArgs().Length > 1) messageTarget = delegate(string s) { ShowWindowsMessage(s); }; else messageTarget = delegate(string s) { Console.WriteLine(s); }; messageTarget("Hello, World!"); } private static void ShowWindowsMessage(string message) { MessageBox.Show(message); } }
2. 我們還可以按照以下示例所演示的那樣將 lambda 表達式分配給 Action<T> 委托實例。
using System; using System.Windows.Forms; public class TestLambdaExpression { public static void Main() { Action<string> messageTarget; if (Environment.GetCommandLineArgs().Length > 1) messageTarget = s => ShowWindowsMessage(s); else messageTarget = s => Console.WriteLine(s); messageTarget("Hello, World!"); } private static void ShowWindowsMessage(string message) { MessageBox.Show(message); } }
完。