本文为原创,如需转载,请注明作者和出处,谢谢!
在C#2.0及C#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);};
分享到:
相关推荐
2. Lambda表达式:Lambda表达式是C# 3.0和VB.NET 9.0引入的新特性,它是匿名函数的一种简洁表示形式。在LINQ查询中,lambda表达式被广泛用于定义查询的操作逻辑,使代码更加简洁和易读。 3. 面向对象的增强:.NET ...
此外,匿名类型和Lambda表达式也是3.5版引入的新特性,它们极大地提高了编写和理解代码的便利性。 在.NET Framework 3.5中,WCF(Windows Communication Foundation)服务成为了统一通信框架,用于创建分布式应用...
《Visual Studio 2008开发新特性系列课程(5):.NET Framework 3.5 新功能介绍》 在本课程中,我们将深入探讨.NET Framework 3.5中的核心新特性,这是一个针对Visual Studio 2008开发环境的重要升级。.NET Framework...
这两个主要的.NET编程语言在新版本中也有所增强,包括匿名类型、自动属性、扩展方法、lambda表达式等,这些特性使得代码更加简洁和易于理解。 8. Windows Workflow Foundation(WF)和Windows Communication ...
这本书旨在帮助读者全面理解C# 3.0的新特性以及如何在.NET Framework 3.5的环境下充分利用它们。 C# 3.0是微软针对.NET Framework 3.5推出的重要更新,引入了许多新的语言特性和改进。其中最显著的是: 1. **...
.NET Compact Framework 3.5版的这些新特性大大提升了移动开发的便利性和效率,使得开发者能够充分利用.NET框架的强大功能来创建功能丰富的嵌入式应用程序。通过PPT文档“20071121am--.NET Compact Framework 3.5版...
7. C#语言和VB.NET更新:这两个.NET Framework的主要编程语言在3.5版本中都得到了改进,例如引入了匿名类型、Lambda表达式、扩展方法等新特性,增强了语言的表达力和灵活性。 8. 其他增强:还包括ASP.NET AJAX的...
《.NET Compact Framework 3.5版的新特性》 .NET Compact Framework 3.5是微软为嵌入式设备和移动设备开发的一款精简版.NET框架,它为开发者提供了丰富的功能和改进,使得在有限资源的平台上开发高效、功能强大的...
5. **Lambda表达式和匿名方法**:C#中的新功能,简化了短小的、一次性使用的函数的定义,常用于LINQ查询。 6. **委托和事件**:讲解如何使用委托作为方法的引用,并结合事件处理,实现异步编程和用户界面交互。 7....
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 类型与命名空间详解 #### 一、.NET Framework 概览 .NET Framework 是一种由微软开发的用于构建 Windows 应用程序的托管代码编程模型。它为软件开发者提供了高生产力的工作环境...
此外,.NET Framework 3.5还增强了C#和VB.NET等编程语言的特性,如匿名方法、Lambda表达式、自动属性、扩展方法等,使得代码编写更加简洁和高效。 第一部分的教程可能涵盖了这些基本概念和技术的介绍,以及如何使用...
除此之外,C# 3.0和Visual Basic 9.0也是.NET Framework 3.5的一部分,它们带来了许多新特性,如匿名方法、lambda表达式、扩展方法、自动属性、匿名类型等,进一步提升了开发者的生产力。 在安装.NET Framework 3.5...
在.NET 3.5版本中,C#引入了多项新特性,如Lambda表达式、LINQ(Language Integrated Query)、匿名方法、自动属性、扩展方法等,这些都极大地提高了代码的简洁性和可读性。 .NET 3.5框架是微软.NET平台的一个重要...
在.NET Framework 3.5中,微软对.NET Framework 2.0进行了大量增强和扩展,引入了诸多新特性和改进,如LINQ(Language Integrated Query,语言集成查询)、扩展方法、匿名类型、Lambda表达式等,极大地提高了开发者...
1. C#语言特性:本书会详细讲解C# 3.0引入的新特性,如匿名方法、lambda表达式、LINQ(Language Integrated Query)以及扩展方法。这些特性极大地提高了代码的可读性和简洁性,特别是LINQ,它为处理各种数据源提供了...
同时,.NET Framework 3.5还包含了C# 3.0和Visual Basic .NET 9.0等语言的新特性,如Lambda表达式、匿名类型和对象初始器等。 在Windows 10中,默认情况下可能并未预装.NET Framework 3.5,这可能会导致一些依赖于...
C#的特性,如lambda表达式、LINQ和异步编程,可以极大地简化处理大量数据时的代码逻辑。同时,由于NPOI是用C#编写的,与.NET Framework的集成非常顺畅,开发者可以方便地将NPOI库与其他.NET组件集成,构建完整的解决...