`
seara
  • 浏览: 646452 次
  • 性别: 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);};
分享到:
评论

相关推荐

    vs2008视频教程5:.NET Framework 3.5 新功能介绍

    2. Lambda表达式:Lambda表达式是C# 3.0和VB.NET 9.0引入的新特性,它是匿名函数的一种简洁表示形式。在LINQ查询中,lambda表达式被广泛用于定义查询的操作逻辑,使代码更加简洁和易读。 3. 面向对象的增强:.NET ...

    .net framework 3.5开发指南

    此外,匿名类型和Lambda表达式也是3.5版引入的新特性,它们极大地提高了编写和理解代码的便利性。 在.NET Framework 3.5中,WCF(Windows Communication Foundation)服务成为了统一通信框架,用于创建分布式应用...

    Visual Studio 2008开发新特性系列课程(5):.NET Framework 3.5 新功能介绍

    《Visual Studio 2008开发新特性系列课程(5):.NET Framework 3.5 新功能介绍》 在本课程中,我们将深入探讨.NET Framework 3.5中的核心新特性,这是一个针对Visual Studio 2008开发环境的重要升级。.NET Framework...

    Visual Studio 2008 .NET Framework 3.5 新功能介绍

    这两个主要的.NET编程语言在新版本中也有所增强,包括匿名类型、自动属性、扩展方法、lambda表达式等,这些特性使得代码更加简洁和易于理解。 8. Windows Workflow Foundation(WF)和Windows Communication ...

    C# 3.0 unleashed with .net framework 3.5

    这本书旨在帮助读者全面理解C# 3.0的新特性以及如何在.NET Framework 3.5的环境下充分利用它们。 C# 3.0是微软针对.NET Framework 3.5推出的重要更新,引入了许多新的语言特性和改进。其中最显著的是: 1. **...

    .NET Compact Framework 3.5版的新特性(PPT)

    .NET Compact Framework 3.5版的这些新特性大大提升了移动开发的便利性和效率,使得开发者能够充分利用.NET框架的强大功能来创建功能丰富的嵌入式应用程序。通过PPT文档“20071121am--.NET Compact Framework 3.5版...

    MCTS Self-Paced Training Kit (Exam 70-503) Microsoft .NET Framework 3.5

    7. C#语言和VB.NET更新:这两个.NET Framework的主要编程语言在3.5版本中都得到了改进,例如引入了匿名类型、Lambda表达式、扩展方法等新特性,增强了语言的表达力和灵活性。 8. 其他增强:还包括ASP.NET AJAX的...

    .NET Compact Framework 3.5版的新特性(Video)

    《.NET Compact Framework 3.5版的新特性》 .NET Compact Framework 3.5是微软为嵌入式设备和移动设备开发的一款精简版.NET框架,它为开发者提供了丰富的功能和改进,使得在有限资源的平台上开发高效、功能强大的...

    C#与.NET.3.5高级程序设计(第4版).

    5. **Lambda表达式和匿名方法**:C#中的新功能,简化了短小的、一次性使用的函数的定义,常用于LINQ查询。 6. **委托和事件**:讲解如何使用委托作为方法的引用,并结合事件处理,实现异步编程和用户界面交互。 7....

    NET Framework 3.5.rar

    3. C# 3.0和VB.NET 9.0:这两个语言版本在.NET Framework 3.5中得到支持,引入了匿名类型、自动属性、扩展方法、lambda表达式等新特性,极大地提升了开发效率。 4. ASP.NET MVC(Model-View-Controller):这是一个...

    Microsoft .NET Framework 3.5 Types and Namespaces

    ### Microsoft .NET Framework 3.5 类型与命名空间详解 #### 一、.NET Framework 概览 .NET Framework 是一种由微软开发的用于构建 Windows 应用程序的托管代码编程模型。它为软件开发者提供了高生产力的工作环境...

    .Net.Framework3.5开发技术详解1.rar

    此外,.NET Framework 3.5还增强了C#和VB.NET等编程语言的特性,如匿名方法、Lambda表达式、自动属性、扩展方法等,使得代码编写更加简洁和高效。 第一部分的教程可能涵盖了这些基本概念和技术的介绍,以及如何使用...

    .NET3.5.rar

    除此之外,C# 3.0和Visual Basic 9.0也是.NET Framework 3.5的一部分,它们带来了许多新特性,如匿名方法、lambda表达式、扩展方法、自动属性、匿名类型等,进一步提升了开发者的生产力。 在安装.NET Framework 3.5...

    C#与.NET.3.5高级程序设计(第4版)

    在.NET 3.5版本中,C#引入了多项新特性,如Lambda表达式、LINQ(Language Integrated Query)、匿名方法、自动属性、扩展方法等,这些都极大地提高了代码的简洁性和可读性。 .NET 3.5框架是微软.NET平台的一个重要...

    .net3.5入门视频

    在.NET Framework 3.5中,微软对.NET Framework 2.0进行了大量增强和扩展,引入了诸多新特性和改进,如LINQ(Language Integrated Query,语言集成查询)、扩展方法、匿名类型、Lambda表达式等,极大地提高了开发者...

    [C#与.NET.3.5高级程序设计(第4版)]

    1. C#语言特性:本书会详细讲解C# 3.0引入的新特性,如匿名方法、lambda表达式、LINQ(Language Integrated Query)以及扩展方法。这些特性极大地提高了代码的可读性和简洁性,特别是LINQ,它为处理各种数据源提供了...

    Win10x64(含32位)dot net framework 3.5(含2.0)安装包,亲测可用,一键安装.rar

    同时,.NET Framework 3.5还包含了C# 3.0和Visual Basic .NET 9.0等语言的新特性,如Lambda表达式、匿名类型和对象初始器等。 在Windows 10中,默认情况下可能并未预装.NET Framework 3.5,这可能会导致一些依赖于...

    C# NPOI 3.5 dll类库

    C#的特性,如lambda表达式、LINQ和异步编程,可以极大地简化处理大量数据时的代码逻辑。同时,由于NPOI是用C#编写的,与.NET Framework的集成非常顺畅,开发者可以方便地将NPOI库与其他.NET组件集成,构建完整的解决...

Global site tag (gtag.js) - Google Analytics