没有 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_calculusMSDN 匿名函数 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 论文下载
相关文章推荐
- 为LINQ服务的C#新特性总结篇---扩展方法,匿名委托,lambda表达式,Action委托,Func委托,Linq中的order by,top和sum函数
- 匿名函数、委托、lambda表达式、扩展方法
- 委托、匿名方法、Lambda表达式的演进
- 用五分钟重温委托,匿名方法,Lambda,泛型委托,表达式树【转载】
- C#学习之初步理解委托、事件、匿名方法和Lambda
- c#-委托,匿名方法,lambda表达的关系
- 五分钟重温委托,匿名方法,Lambda,泛型委托,表达式树
- 委托(3.匿名方法、lambda、闭包、foreach)
- Linq Lambda 匿名方法 查找DataRow
- C# 传统的委托、匿名方法、Lambda对比
- 委托、匿名方法、Lambda表达式的演进
- 用五分钟重温委托,匿名方法,Lambda,泛型委托,表达式树
- 从委托、匿名方法到Lambda
- 通过Func 委托理解委托和匿名方法及Lambda 表达式
- 委托,匿名方法,Lambda 表达式 的关系
- 委托,匿名方法,Lambda,泛型委托,表达式树
- 转帖:用五分钟重温委托,匿名方法,Lambda,泛型委托,表达式树
- Linq lambda 匿名方法
- 委托、事件、匿名方法、Lambda
- C# 委托的发展史: .Net 1.x 委托 =>.Net 2.x 匿名方法 => .Net 3.0/3.5 Lambda 表达式