lambda表达式与函数指针
猜猜下面两部分C#代码的输出是什么:
(一)
static void Main(string[] args)
{
Print(23);
Console.ReadKey();
}
static Action Print(int n)
{
return () =>
{
Console.WriteLine(n);
};
}
{
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);
};
}
{
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;
}
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>指向的那个函数。
不过即便是第二种写法,我还是不建议使用,因为它不易阅读,不够“优雅”。 ;-)
posted on 2009-05-30 12:02 J.D Huang 阅读(2112) 评论(2) 编辑 收藏 举报