猜猜下面兩部分C#代碼的輸出是什麼:
(一)
static void Main(string[] args)
{
Print(23);
Console.ReadKey();
}
static Action Print(int n)
{
return () =>
{
Console.WriteLine(n);
};
}
(二)
static void Main(string[] args)
{
Print()(23);
Console.ReadKey();
}
static Action<int> Print()
{
return (int n) =>
{
Console.WriteLine(n);
};
}
如果你是一個C++程式員, 也許上面並不是個陌生的用法, 因為C++裡面可以使用函數指標,如下:
#include <iostream>
using namespace std;
void Print(int a);
int main()
{
typedef void (*Action)(int a);//定義一個名為Action的函數指標類型,C#中的委託類似.
Action action=Print;
(*action)(23);//注意這裡與(二)中的用法是類似的。
getchar();
return 0;
}
void Print(int a)
{
cout<<a<<endl;
}
但是C#裡面沒有, 不過C#裡面有委託. 它起著類似的作用, Lambda運算式的值是委託類型, 第一個例子裡面什麼輸出也沒有, Print函數簡單返回了一個委託(Action類型), 也可以看作是指向函數Funtion(){Console.WriteLine(n);}的函數指標.但是函數本身並沒有在這裡得到執行。如果你看了第二個例子你也許會更清楚這一點,第二個例子用一句話說就是調用了該Action<int>指向的那個函數。
不過即便是第二種寫法,我還是不建議使用,因為它不易閱讀,不夠“優雅”。