(转)C# 3.0语言的新特性——Lambda表达式
2011-11-03 11:33
239 查看
C# 3.0语言的新特性——Lambda表达式
Lambda表达式
在C# 3.0 中,Microsoft 添加了“lambda 表达式”。lamdba表达式曾经用于很久以前的LISP计算机语言中,在1936年由一个美国数学家Alonzo Church对其进行了概念化描述。这些表达式提供了便捷的语法来指定一个算法。但是在接下来开始介绍lambda表达式之前,首先看看将一个算法指定为某个方法的参数的演进过程,因为这正是lambda表达式的目的。
1. 使用命名的方法
在C# 2.0之前,当一个方法或变量要用到委托(delegate)时,开发人员必须创建一个命名方法,并在需要委托的位置传入这个名称。例如,考虑以下情况。假定有两个开发者,一个是通用代码开发者,而另一个是应用程序开发者。但是,实际上没有必要的有两个不同的开发者,只需要通过标记来描述两个不同的角色即可。通用代码开发者需要创建通用目的代码,这些代码可以在整个工程中被重复使用。应用程序开发者将使用这些通用目的的代码来创建一个应用程序。
在这个示例的场景中,通用代码开发者想要创建一个通用方法来筛选整形数组,但是这个通用方法要能够指定用来筛选该数组的算法。首先,开发者必须声明一个委托 delegate,该委托的设计原型就是收到一个int类型,如果在被筛选的数组中确实包含一个int类型,则这个委托返回true。
于是,开发者创建了一个工具类并添加了 delegate 和筛选方法。这个公告代码如下所示:
上面列出的 FilterArrayOfInts 方法允许应用程序开发者将一个整形数组和一个 delegate 作为参数传递到筛选方法中,并将获得一个筛选后的数组。
现在,假定应用程序开发者只想筛选奇数。则可以参见下面的筛选方法,该方法在开发者的应用程序代码中进行了声明。
请注意,要想将 delegate 传递为 FilterArrayOfInts 方法的第二个参数,应用程序开发者只需要传递该方法的名称。只需要简单的创建另一个筛选器,应用程序开发者可以筛选不同的数据。应用程序开发者还可以为偶数、素数,以及任何想要的规则创建筛选器。方法委托(delegate)可以通过这种方式成为具有很高可重用的代码。
2. 使用匿名方法
上面介绍的方法是很用效而且很好的,但是为所有这些筛选方法和所需的任何其他方法委托编写代码是很单调乏味的。在这些方法中,实际上许多方法都只用于单次调用,因此为所有这些方法都创建命名方法是很麻烦的。从C# 2.0开始,开发者可以使用匿名方法来传递内联代码,也就是说,用内联代码来取代方法委托。匿名方法允许开发者在通常用来传递方法委托的位置指定一段筛选代码即可。示例如下:3. 使用lambda表达式
lambda 表达式可以写成一个逗号分隔的参数列表,后面加一个 lamdba 操作符,在后面是一个表达式或声明函数。如果有多个输入参数,则使用圆括号包含输入参数。在 C# 中,lambda 操作符可以写为“=>”。这样,C# 中的 lambda表达式可以写成:下面是 lambda 表达式的有一个简单示例:
下面的 lambda 表达式将返回输入参数的长度。因此 delegate 应该指定一个int 型返回值:
警告: 请确认编写的 lambda 表达式满足 delegate 定义指定的输入类型,并返回 delegate 定义的返回类型。
要想记得更清楚一点,可以参考下面的公告代码开发者定义的 delegate 语句:
如果使用 lambda 表达式,则上面的实例可以写成这样:
总结
回顾一下,下面列出了每种方法的示例代码中的关键代码行:提示: 对于复杂和需要重用的算法,最好可以使用命名方法,这样,任何开发者都可以很方便地重新使用这些算法了,并且,开发者不必详细了解这个算法。
内容来源
《Pro LINQ Language Integrated Query in C# 2008》——Joseph C. Rattz, Jr.相关文章推荐
- C# 3.0语言的新特性——Lambda表达式
- C# 3.0语言的新特性——Lambda表达式
- C# 3.0语言新特性之Lambda表达式
- C# 3.0语言的新特性——Lambda表达式
- LINQ体验(2)——C# 3.0新语言特性和改进(上篇)
- LINQ体验(2)——C# 3.0新语言特性和改进(上篇)
- c# 3.0 语言的新特性(三)
- LINQ体验(3)——C# 3.0新语言特性和改进(下篇)
- C# 3.0新语言特性和改进
- C# 3.0语言特性
- C# 3.0语言特性
- LINQ体验(1)——C# 3.0新语言特性和改进(上篇) 【转】
- LINQ体验(2)——C# 3.0新语言特性和改进(上篇)
- LINQ体验(2)——C# 3.0新语言特性和改进(上篇)
- .net](2)——C# 3.0新语言特性和改进 [转]
- LINQ体验(2)--C# 3.0新语言特性和改进(上篇)
- C# 3.0语言新特性(语言规范)
- 步步为营VS 2008 + .NET 3.5(4) - C# 3.0新特性之LambdaExpressions(Lambda表达式)、QuerySyntax(查询语法)和AnonymousTypes(匿名类型)
- C# 3.0语言规范 (C# 3.0新特性)
- 4、步步为营VS 2008 + .NET 3.5(4) - C# 3.0新特性之LambdaExpressions(Lambda表达式)、QuerySyntax(查询语法)和AnonymousTypes(匿名类型)