Your Ad Here
首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 编程语言 > .NET > VB.NET > [乱弹] Anonymous Method - Lambda Expression - *LINQ
【标  题】:[乱弹] Anonymous Method - Lambda Expression - *LINQ
【关键字】:Anonymous,Method,Lambda,Expression,LINQ
【来  源】:http://blog.joycode.com/sunmast/archive/2006/09/29/anonymous_method_lambda_expr_linq.aspx

[乱弹] Anonymous Method - Lambda Expression - *LINQ

Your Ad Here

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

Struts国际化处理:【上一篇】
2则产品新闻:【下一篇】
【相关文章】
  • Linq的超越——强类型反射
  • Template Method
  • select() function use method
  • pselect() function use method
  • poll() function use method
  • getprotobyname() function use method!
  • gethostbyname_r() function use method!
  • getaddrinfo() function simple use method!
  • boost lambda简介
  • SDEM90(Systems Development Engineering. Methodology 90)
  • 【随机文章】
  • FreeBSD全能服务器安装手册之文件服务器篇之A安装配置篇
  • storage vendor
  • 用Fireworks MX做按钮
  • 用户自定义导航
  • asp性能测试第二部分(转)(二)
  • 下一代互联网联盟成立 IPv6网5月试运行
  • 中文Access2000速成教程--1.8 定义表之间的关系
  • ST开发经验谈(一)----长篇连载
  • 用于3G无线网络的精细可分级编码技术
  • TSM Client ANS1501E 错误解决步骤
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 软讯网络 All Rigths Reserved.