`
seara
  • 浏览: 622528 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

.net framework3.5新特性(2):Lambda表达式

阅读更多

本文为原创,如需转载,请注明作者和出处,谢谢!

C#2.0C#1.x中,需要使用delegate来定义方法指针。如下面的代码如示:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->publicdelegateboolFilter(intnum);// delegate类型

publicint[]searchArray(int[]values,Filterfilter)
{
List
<int>result=newList<int>();
foreach(intiinvalues)
{
if(filter(i))
result.Add(i);
}
returnresult.ToArray();
}

从上面的代码可以看出,定义了一个叫Filter的delegate类型。然后searchArray方法的第二个参数通过Filter类型将方法指针传到该方法中。 实际上,从IL可以看出,Filter被编译成了一个类,而且这个类是System.MulticastDelegate的子类。但和普通类不同的是,System.MulticastDelegate及其子类只能由编译器使用,不能直接写在源程序中。也就是说,只能在IL中使用。

如果要调用searchArray方法,需要先定义一个和Filter拥有同样参数和返回值的方法,代码如下:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->publicboolMyFilter(intnum)
{
return((num&1)==0);
}

下面的代码调用了searchArray方法:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->int[]intArray=newint[]{1,2,3,4,5,6,7,8};
int[]evenArray=searchArray(intArray,MyFilter);
foreach(intiinevenArray)
textBox1.AppendText(i.ToString());


C#2.0开始支持匿名方法,开发人员可以通过匿名方法用内联代码形式取代delegate,如上面的调用代码可以修改为下面的形式:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->int[]intArray=newint[]{1,2,3,4,5,6,7,8};
int[]evenArray=searchArray(intArray,delegate(inti){return((i&1)==0);});
foreach(intiinevenArray)
textBox1.AppendText(i.ToString());

上面的代码将匿名方法转换成了delegate

然而,从C#3.0.net framework3.5)开始,支持了Lambda表达式。所谓Lambda表达式就是delegate和匿名方法的简写形式,Lambda表达式的语法如下:

(param1, param2 ...,paramN) =>

{

表达式1;

表达式2;

return 返回值;

}

上面语法中的param1...paramN就表示方法的参数(不用确定类型,C#编译器会为我们做这个工作),而{...}里面的内容就和方法体中的内容完全一样。

如果delegate没有参数,可以只写(),如下面的方法所示:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->publicdelegatevoidMethod1();

publicvoidtest()
{
Method1method1
=()=>{inti=4;i+=6;};
}

如果delegate只有一个参数,参数两边的括号可以不写,代码如下:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->publicdelegatevoidMethod2(inti);

publicvoidtest()
{
Method2method2
=i=>{i++;i+=6;};
}

如果delegate有返回值,{...}中的最后一条语句需要使用return来返回相应的值,代码如下:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->publicdelegateintMethod3(intx,inty);

publicvoidtest()
{
Method3method3
=(x,y)=>{x++;y++;returnx+y;};
}

如果使用Lambda表达式改写本文开头的例子,就会变得非常简单,代码如下:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->int[]intArray=newint[]{1,2,3,4,5,6,7,8};
int[]evenArray=searchArray(intArray,i=>{return(i&1)==0;});
foreach(intiinevenArray)
textBox1.AppendText(i.ToString());

当然,我们也可以将Lamdba表达式赋给一个delegate,再进行传值,代码如下;

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->Filterfilter=i=>{return(i&1)==0;};
int[]intArray=newint[]{1,2,3,4,5,6,7,8};
int[]evenArray=searchArray(intArray,filter);
foreach(intiinevenArray)
textBox1.AppendText(i.ToString());

从本质上讲,Lamdba表达式经过C#编译器编译后,仍然会变成delegate的形式,也就是说Lamdba表达式只是在语法层次上的改进,并不是IL提供的新的指令。如下面的两行代码是等价的:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->Filterfilter=i=>{return(i&1)==0;};
Filterfilter
=delegate(inti){return((i&1)==0);};
分享到:
评论

相关推荐

    ASP.NET 3.5 开发大全

    第1章 认识ASP.NET 3.5 1.1 什么是ASP.NET 1.1.1 .NET历史与展望 1.1.2 ASP.NET与ASP 1.1.3 ASP.NET开发工具 1.1.4 ASP.NET客户端 1.1.5 ASP.NET 3.5新增控件 1.1.6 ASP.NET 3.5 AJAX 1.2 .NET应用程序需框架 1.2.1 ...

    ASP.NET3.5从入门到精通

    第 1 章认识 ASP.NET 3.5 1.1 什么是ASP.NET 1.1.1 .NET 历史与展望 1.1.2 ASP.NET 与ASP 1.1.3 ASP.NET 开发工具 1.1.4 ASP.NET 客户端 1.1.5 ASP.NET 3.5 新增控件 1.1.6 ASP.NET 3.5 AJAX 1.2 .NET 应用程序需...

    ASP.NET 3.5 开发大全11-15

    第1章 认识ASP.NET 3.5 1.1 什么是ASP.NET 1.1.1 .NET历史与展望 1.1.2 ASP.NET与ASP 1.1.3 ASP.NET开发工具 1.1.4 ASP.NET客户端 1.1.5 ASP.NET 3.5新增控件 1.1.6 ASP.NET 3.5 AJAX 1.2 .NET应用程序需框架 1.2.1 ...

    ASP.NET 3.5 开发大全1-5

    第1章 认识ASP.NET 3.5 1.1 什么是ASP.NET 1.1.1 .NET历史与展望 1.1.2 ASP.NET与ASP 1.1.3 ASP.NET开发工具 1.1.4 ASP.NET客户端 1.1.5 ASP.NET 3.5新增控件 1.1.6 ASP.NET 3.5 AJAX 1.2 .NET应用程序需框架 1.2.1 ...

    ASP.NET 3.5 开发大全word课件

    第1章 认识ASP.NET 3.5 1.1 什么是ASP.NET 1.1.1 .NET历史与展望 1.1.2 ASP.NET与ASP 1.1.3 ASP.NET开发工具 1.1.4 ASP.NET客户端 1.1.5 ASP.NET 3.5新增控件 1.1.6 ASP.NET 3.5 AJAX 1.2 .NET应用程序需框架 1.2.1 ...

    .net Reflector 9.0附注册机

    .NET Reflector是一个.NET...Lambda表达式支持 匿名方法和可空类型支持 扩展方法支持 上下文相关的文档视图 找出虚拟方法重写 代码URL支持——在浏览器中导航至代码:/ / mscor lib / system.object 挖掘程序集中的资源

    .NET Reflector 8.1{内含破解教程和注册机}

    .NET Reflector介绍: ...Lambda表达式支持 匿名方法和可空类型支持 扩展方法支持 上下文相关的文档视图 找出虚拟方法重写 代码URL支持——在浏览器中导航至代码:/ / mscor lib / system.object 挖掘程序集中的资源

    ASP.NET.4揭秘

    20.1 c#和vb.net的新特性720 20.1.1 理解自动属性721 20.1.2 理解初始化器721 20.1.3 理解类型推断723 20.1.4 理解匿名类型724 20.1.5 理解泛型724 20.1.6 理解lambda表达式726 20.1.7 理解扩展方法729 20.1.8 理解...

    ASPNET35开发大全第一章

    书名:ASP.NET 3.5 开发大全 署名:郭靖 页数:722 这是我见过的一本非常好的教程 第一篇 .NET基础 第1章 认识ASP.NET 3.5 1.1 什么是ASP.NET 1.1.1 .NET历史与展望 1.1.2 ASP.NET与ASP 1.1.3 ASP.NET开发工具 ...

    ASP.NET 控件的使用

    第1章 ASP.NET Framework概览 2 1.1 ASP.NET和.NET Framework 5 1.1.1 框架类库 5 1.1.2 公共语言运行库 9 1.2 ASP.NET控件 10 1.2.1 ASP.NET控件概览 11 1.2.2 HTML控件 12 1.2.3 理解和处理控件事件 12 1.2.4 ...

    LINQ 实战 1/11

    12.3.5 示例2:非泛型的、领域相关的操作符 340 12.3.6 示例3:非序列的查询操作符 342 12.4 查询Web服务:LINQ to Amazon 343 12.4.1 LINQ to Amazon介绍 344 12.4.2 需求 345 12.4.3 实现 346 12.5 ...

    Visual.Basic.2010.&.NET4.高级编程(第6版)-文字版.pdf

    9.12 vb中的lambda表达式 387 9.13 小结 389 第10章 ado.net和linq 391 10.1 ado.net的体系结构 392 10.2 ado.net的基本功能 393 10.2.1 ado.net的常见任务 393 10.2.2 ado.net的基本名称空间和类 398 ...

    LINQ 实战 2/11

    12.3.5 示例2:非泛型的、领域相关的操作符 340 12.3.6 示例3:非序列的查询操作符 342 12.4 查询Web服务:LINQ to Amazon 343 12.4.1 LINQ to Amazon介绍 344 12.4.2 需求 345 12.4.3 实现 346 12.5 ...

    AspNet MVC 开发技术

    14.7.5 lambda表达式用作委托和表达式树 385 14.7.6 lambda表达式和集合 386 14.8 小结 388 14.9 练习 389 14.10 本章要点 390 第Ⅱ部分 windows 编 程 第15章 windows编程基础 393 15.1 控件 393 15.1.1 属性 394 ...

    LINQ 实战 3/11

    12.3.5 示例2:非泛型的、领域相关的操作符 340 12.3.6 示例3:非序列的查询操作符 342 12.4 查询Web服务:LINQ to Amazon 343 12.4.1 LINQ to Amazon介绍 344 12.4.2 需求 345 12.4.3 实现 346 12.5 ...

    LINQ 实战 4/11

    12.3.5 示例2:非泛型的、领域相关的操作符 340 12.3.6 示例3:非序列的查询操作符 342 12.4 查询Web服务:LINQ to Amazon 343 12.4.1 LINQ to Amazon介绍 344 12.4.2 需求 345 12.4.3 实现 346 12.5 ...

    LINQ 实战 8/11

    12.3.5 示例2:非泛型的、领域相关的操作符 340 12.3.6 示例3:非序列的查询操作符 342 12.4 查询Web服务:LINQ to Amazon 343 12.4.1 LINQ to Amazon介绍 344 12.4.2 需求 345 12.4.3 实现 346 12.5 ...

Global site tag (gtag.js) - Google Analytics