- 引入
- 概述
- 匿名函数
- 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 委托创建过程的发展:
Console.ReadKey();
}
}