一切皆有可能

SLEEPY BUT POWERFUL (A.K.A 速马) Creative Commons License
随笔 - 43, 评论 - 483, 引用 - 14

导航

关于

我

联系方式 (夏桅 xia4 wei2)

译作

 

三章样章阅读
[CSDN读书频道提供]

 

想做点好事的来看看

一字不识的藏族同胞阿牛创办的完全免费学校

 

MVP Profile

Visual Developer - .NET/C#

Visitors

Locations of visitors to this page

标签

每月存档

最新留言

广告

 

Anonymous Method - Lambda Expression

Lambda表达式是C# 3.0的新特性之一,最简单的Lambda表达式,像这样的:

Func<int,int> f = x => x + 1;

会被编译为一个方法:

int f(int x)
{
return x + 1;
}

所以它和匿名方法的实现很类似,可以说是匿名方法的带类型推导精简版本。和匿名方法一样,这是一种编译器行为;但是除了更“甜”的语法之外,C# 3.0进一步表现出了不少Functional Programming的特性,虽然还不是很“纯”(大概是受到强类型语言总思路的制约吧)。

和Lambda Expression相关的,C# 3.0还有个叫作Expression Tree的概念。这是它和Anonymous Method所不同的地方,Expression Tree不会被直接编译成一个实际的方法,而是编译成一个类似CodeDOM的语法树。比如:

Expression<Func<int, bool>> exprLambda = x => (x & 1) == 0;
// 请对比:Func<int, bool> nonExprLambda = x => (x & 1) == 0;

会被编译为:

ParameterExpression xParam = Expression.Parameter(typeof(int), "x");
Expression<Func<int, bool>> exprLambda = Expression.Lambda<Func<int, bool>>(
    Expression.EQ(
        Expression.BitAnd(xParam, Expression.Constant(1)),
        Expression.Constant(0)),
    xParam);

这个变量exprLambda是一个真正的方法,而不是一个方法指针(delegate/代理)。C# 3.0 Specification:“Following these assignments, the delegate f references a method that returns x + 1, and the expression tree e references a data structure that describes the expression x + 1.”它是方法体本身的描述,就像CodeDOM那样,通过代码描述代码,并且可以被编译、执行(不过这些动作都是透明的)。显然,和CodeDOM一样,你也可以遍历这个树,修改树结点,或者做一些别的特别的事情。这将使C#变得更加动态化(当然cost就是性能低一点点)。

*LINQ

LINQ/DLINQ/XLINQ(以及YLINQ、ZLINQ等等什么LINQ)是基于Lambda语法的。不过这里也存在着大量的语法糖(OK,只要没有带来负面作用那这个词也不是贬义词),比如这句:

from c in customers
join o in orders on c.CustomerID equals o.CustomerID
select new { c.Name, o.OrderDate, o.Total }

等价形式为:

customers.Join(orders, c => c.CustomerID, o => o.CustomerID,
 (c, o) => new { c.Name, o.OrderDate, o.Total })

所以*LINQ也是个编译器特性(与CLR无关)


一切改变都很酷,也确实能提高开发效率,不过我唯一觉得不喜欢的是,C# 3.0一下子引入了这么多的新语法,它已经从一个短小精悍的语言变得越来越复杂了。。

Reference

C# 3.0 Language Specification
http://download.microsoft.com/download/5/8/6/5868081c-68aa-40de-9a45-a3803d8134b8/csharp_3.0_specification.doc

C# 3.0 and LINQ - Expression Trees
http://www.interact-sw.co.uk/iangblog/2005/09/30/expressiontrees

打印 | 张贴于 2006-09-29 15:57:00 | Tag:Inside CLR

留言反馈

#回复: [乱弹] Anonymous Method - Lambda Expression - *LINQ 编辑
@Ninputer
实际上诸如
customers.Join(orders, c => c.CustomerID, o => o.CustomerID,
(c, o) => new { c.Name, o.OrderDate, o.Total })

这种语法还是很难理解的--没错,这个是很难理解,但是C# 3.0希望程序员写的是
from c in customers
join o in orders on c.CustomerID equals o.CustomerID
select new { c.Name, o.OrderDate, o.Total }
这个很像TSQL,很好理解,至于那个转换是C# 3.0编译器实现的,一般程序员可以暂时不用去管它。
2007-04-11 00:23:00 | [匿名:Boler Guo]
#re: [乱弹] Anonymous Method - Lambda Expression - *LINQ 编辑
>>> 宏在c c++中是非常丑陋的东西.
>>> c#好像偏偏喜欢这种东西.

我对你真的没语言了
2006-10-04 23:59:00 | [匿名:sunmast]
#re: [乱弹] Anonymous Method - Lambda Expression - *LINQ 编辑
对了,我觉得Expression Tree本质上是希望构建一个可以远程传输的东西。因为Lambda本质上是匿名方法,方法逻辑是IL代码,它是不能远程传输的。所以要想进行Lambda查询式的远程查询,必须有一种将“运算规则”序列化的机制。Expression tree正是如此。
2006-10-04 10:51:00 | [匿名:Ninputer]
#re: [乱弹] Anonymous Method - Lambda Expression - *LINQ 编辑
有心人可数一下,两种定义的字数.

再比较比较可读性.

以及复杂化对C#纯洁性的影响......
2006-10-02 02:44:00 | [匿名:Hello]
#re: [乱弹] Anonymous Method - Lambda Expression - *LINQ 编辑
宏在c c++中是非常丑陋的东西.

c#好像偏偏喜欢这种东西.
2006-10-02 02:40:00 | [匿名:Hello]
#re: [乱弹] Anonymous Method - Lambda Expression - *LINQ 编辑
实际上诸如
customers.Join(orders, c => c.CustomerID, o => o.CustomerID,
(c, o) => new { c.Name, o.OrderDate, o.Total })

这种语法还是很难理解的,没有学过的人凭自己的想象完全理解实属不易。我们在强调语言表达能力的同时,渐渐走入了高级特性理解障碍问题。
今后C#也会和C++一样,少数能够将这些特性完全理解的家伙会写出眼花缭乱但没人能看懂的程序。
2006-09-30 17:49:00 | [匿名:Ninputer]
#re: [乱弹] Anonymous Method - Lambda Expression - *LINQ 编辑
好东西,但我不认为它让C#变复杂。因为原来的东西没变呀。新的如果你当它不存在不用它,和原来的就一样。如果真复杂了,那么它一开始就是复杂的。
2006-09-30 09:34:00 | [匿名:DSharp]
#re: [乱弹] Anonymous Method - Lambda Expression - *LINQ 编辑
大不了不用呗,不过我还是觉得太冒进了,应该在其他语言(比如IronPython)上面先做实验
2006-09-30 09:12:00 | [匿名:dali]
#re: [乱弹] Anonymous Method - Lambda Expression - *LINQ 编辑
拜托,这些可都是非常实用的东西,并且语法依然漂亮,只是略显复杂一点而已。

>>> 对于底层的控制为什么一点动作都没有
>>> 不是说C#具有与C++一样的功能吗
C#的目标并不是完全取代C/C++,每种语言都有自己的定位的

我觉得你对C#的理解有点问题嗯
2006-09-29 16:17:00 | [匿名:sunmast]
#re: [乱弹] Anonymous Method - Lambda Expression - *LINQ 编辑
C#的发展目标是不是让它写的代码象图一样的漂亮啊!!!中看不中用的东西一定会死掉的,对于底层的控制为什么一点动作都没有(如非托管指针搁在那里一点都没有发展),不是说C#具有与C++一样的功能吗??
2006-09-29 16:14:00 | [匿名:zjh]
对不起,目前本随笔不允许发表新评论.

Powered by: Joycode.MVC引擎 0.5.2.0