您的位置:首页 > 其它

没有 Lambda 演算何来匿名函数——匿名函数(匿名方法和Lambda)、委托、LINQ

2011-11-25 13:29 323 查看

本文内容

引入
概述
匿名函数
    Lambda 表达式
    匿名方法
参看资料


引入

本文在 VS 2008 环境下,阐述自己对 Lambda 表达式、匿名函数、委托和 LINQ 谈谈自己的理解。我对这个问题的思考,始于以下阶段:

毕业刚参加工作时,使用 VS 2005 C#,它还没有 LINQ 特性。那时的主要精力在后台代码,初步掌握了委托、泛型等,以及设计模式,并尝试编写 JavaScript 代码,只是不太重视;
之后,尤其是跳槽后,对 JavaScript、jQuery、Ajax 、DOM、HTML、CSS产生了兴趣,发现它们类似 JSON 的书写方式很有意思,那时已经使用 VS 2008,也有这种方式,因此在实际项目中时不时地采用这种方式书写;
期间,知道了 LINQ,觉得不错,在很大程度上,接近自然语言,简化了代码逻辑和代码量;
但问题是,这种书写方式除了跟之前(VS 2005 前)完全不同外,无论是 JavaScript,还是 C#,这种方式,可以在不定义变量,不定义函数名、形参和返回值类型等情况下使用,的确让人困惑;
为了更好的理解这种书写方式,我学习了 JSON 的理论,之后是 Lambda 表达式、LINQ。
往往,当你缺少某方面知识时,对一个问题的理解不可能深入。

 

概述

我们都知道,定义一个函数,要有名字,也许要有形参列表、返回值类型。即便是现在,也是如此。

而 Lambda 演算(Lambda calculus),告诉程序员们,其实不然,定义函数可以没有名字,没有形参列表,没有返回值类型,什么都没有,只有函数体,一些表达式或是语句(现在知道这是基于 Lambda 的类型推理),这就是匿名函数。

另一方面——委托,委托相当于函数(方法)指针(事件是委托的特例),那么完全可以利用匿名函数简化委托。Lambda 表达式的理论基础是Lambda 演算(Alonzo Church, 1930)。

LINQ 就是基于 Lambda 表达式(匿名函数)、泛型和简化的委托。

本文的重点是从大的方面上了解 Lambda 表达式和其应用,而不是它的语法。

 

匿名函数

匿名函数是一个“内联(inline)”语句或表达式,可在需要委托类型的任何地方使用。可以使用匿名函数来初始化命名委托,或传递命名委托(而不是命名委托类型)作为方法参数。

有两种匿名函数:

Lambda 表达式
匿名方法

C# 中委托的发展

C# 1.0 中,通过用其他位置定义的方法显式初始化委托来创建委托的实例。
C# 2.0 引入了匿名方法(anonymous method)的概念,用匿名方法初始化委托,在委托中执行未命名的内联语句块。
C# 3.0 引入了 Lambda 表达式,与匿名方法的概念类似,但更具表现力并且更简练。匿名方法和Lambda 表达式统称为“匿名函数”。
通常,针对 .NET Framework 3.5 及更高版本应使用 Lambda 表达式。
下面的示例演示了从 C# 1.0 到 C# 3.0 委托创建过程的发展:

View Code

void StartThread()
{
System.Threading.Thread t1 = new System.Threading.Thread
(delegate()
{
System.Console.Write("Hello, ");
System.Console.WriteLine("World!");
});
t1.Start();
}


 

参考资料

Wiki Lambda 表达式 http://en.wikipedia.org/wiki/Lambda_calculus

MSDN 匿名函数 http://msdn.microsoft.com/zh-cn/library/bb882516.aspx

MSDN 委托Func<Of T, TResult> http://msdn.microsoft.com/zh-cn/library/bb549151.aspx

MSDN 表达式树Expression<Func> http://msdn.microsoft.com/zh-cn/library/system.linq.expressions.expression.aspx

System.Linq.Enumerable 类 http://msdn.microsoft.com/zh-cn/library/system.linq.enumerable(v=VS.90).aspx

System.Linq.Queryable 类 http://msdn.microsoft.com/zh-cn/library/bb293129(v=VS.90).aspx

Good Math, Bad Math 关于Lambda 阐述 http://scienceblogs.com/goodmath/goodmath/lambda_calculus/

 

Alonzo Church 1936 论文下载
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: