Action<T> and Func<T>
0 | 24,554 |
在前一篇談Closure的文章裡,提到了delegate與匿名方法,今天再補充一下delegate的簡化寫法。
在上回的程式範例中,為了要呼叫執行期間才產生的方法,我們宣告了delegate void MyFunc(string paramStr)。由於參數型別不同就要有獨立的宣告,若程式碼涉及多種參數各不相同的匿名方法,我們勢必要寫出一堆必要但是沒啥意義的delegate宣告。delegate宣告主要是要明確定義呼叫時傳入的參數及傳回值型別,當作方法變數的型別(即MyFunc[] funcs = new MyFunc[4];),常常只用一次就丟,每次要為這些"抛棄式"delegate宣告取名稱都害我要想半天,因此我始終覺得它是件該被省略的無聊事。
Action Delegate的出現解決了以上困擾! 從C# 2.0起,.NET Framework內建了Action, Action<T>, Action<T, T>, Action<T, T, T>, Action<T, T, T, T>,可以省下0到4個參數的delegate宣告。回到Closure文章的例子看一下實際應用,引用Action<T>,我們可省去MyFunc delegate的宣告,然後把funcs變數宣告那一列改成Action<string>[] funcs = new Action<string>[4];,其餘的程式碼完全不變,這樣就不用再花時間去想MyFunc這種鳥名字了。
Action適用於不傳回值的方法,若方法有傳回值,則.NET 2.0另外備有Func<TResult>, Func<T, TResult>, Func<T, T, TResult>, Func<T, T, T, TResult>, Func<T, T, T, T, TResult>可資利用。
以下補上簡單範例,希望讓新手朋友能對Action與Func有多一份認識。
using System;
using System.Text;
class Program
{
static void Main(string[] args)
{
Action<int> f1 = i => { Console.WriteLine("i={0}", i); };
f1(10);
Action<int, string> f2 =
(i, s) => { Console.WriteLine("i={0} s={1}", i, s); };
f2(99, "Hello");
Action<byte[], Encoding> f3 =
(b, e) => { Console.WriteLine(e.GetString(b)); };
f3(new byte[] { 65, 66, 67 }, Encoding.ASCII);
Func<int, string> f4 =
i => string.Format("i={0} i+1={1}", i, i+1);
Console.WriteLine(f4(1));
Console.Read();
}
}
執行結果:
i=10
i=99 s=Hello
ABC
i=1 i+1=2
Comments
Be the first to post a comment