成都创新互联网站制作重庆分公司

Linqlambda表达式的示例分析

小编给大家分享一下Linq lambda表达式的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

任丘网站建设公司创新互联,任丘网站设计制作,有大型网站制作公司丰富经验。已为任丘近千家提供企业网站建设服务。企业网站搭建\成都外贸网站制作要多少钱,请找那个售后服务好的任丘做网站的公司定做!

Linq lambda表达式

了解过C# 3.0的新特性的话应该知道,在C# 3.0中新引入了一个语法结构,称为lambda expression(Linq lambda表达式/匿名函数)。对此尚不了解的也可以到MSDN上看看,Linq lambda表达式。Linq lambda表达式既可以赋值给一个委托(delegate)类型,例如Action、Func等系列的内建委托类型;也可以赋值给Expression类型,例如以下Linq lambda表达式:

x => -x

当它被直接赋值给Func类型的变量时,C#编译器会将它的内容编译为一个静态方法,并创建一个对应类型的引用赋值给变量。

static class Program {    static void Main( string[ ] args ) {    Func negateFunc = x => -x;    }  }

C#编译器会编译为类似下面的代码:

internal static class Program    [CompilerGenerated]    private static int 
b__0( int x ) {    return -x;    }  private static void Main( string[ ] args ) {    Func negateFunc = new Func
b__0 );    }  }

(实际上还涉及到缓存那个委托,这里省略掉了。另外,之所以会编译为一个静态方法是因为这个Linq lambda表达式没有使用任何“自由变量”,也就是既不是参数或局部变量也不是类的成员的变量。在现有的C#编译器实现中,如果一个匿名函数使用了“this”,那么对应生成的方法会是成员方法;如果使用了其它自由变量的话则会生成一个私有内部类来存放匿名函数所使用到的自由变量,并在这个内部类里生成匿名函数对应的方法。这里作为例子选择了最简单的情况来介绍。)

如此将一个Linq lambda表达式编译为一个实际的函数后,其中的MSIL字节码可以为CLR所理解并执行。这样就足够实现in-memory query了,例如LINQ-to-Objects、LINQ-to-DataSet等。但其它平台无法理解MSIL,要对函数进行分析然后执行就会十分困难。例如说,如果想让一个Linq lambda表达式在SQL Server上执行,该如何让SQL Server也理解它呢?

Expression tree与Linq lambda表达式

MSIL之所以不便于分析是因为它将原本是树状结构的程序代码转换为了线性结构,损失了一些信息,主要是损失了程序代码的“结构性”,更接近于底层而降低了抽象程度。
我们知道,程序源代码对应着具体语法树(concrete syntax tree),每个叶节点对应着代码里的一个词素,其上则是各种语法结构,如表达式、语句、声明、定义等。抽象语法树(abstract syntax tree,AST)则在具体语法树的基础上将一些诸如关键字、括号等冗余信息去掉,让树更加整洁,便于分析而不损失任何有用的信息。

以上是“Linq lambda表达式的示例分析”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注创新互联行业资讯频道!


名称栏目:Linqlambda表达式的示例分析
文章位置:http://cxhlcq.com/article/ijgiij.html

其他资讯

在线咨询

微信咨询

电话咨询

028-86922220(工作日)

18980820575(7×24)

提交需求

返回顶部