初学者什么乐器最容易学(自学哪种乐器最容易学)
693
2022-05-30
目录
表达式树练习实践:入门基础
lambda 创建表达式树
通过 API 创建表达式树
什么是表达式树
创建表达式树
Expression< TDelegate >
解析/执行表达式树
表达式树练习实践:入门基础
什么是表达式树
来自微软官方文档的定义:
表达式树以树形数据结构表示代码。
它能干什么呢?
你可以对表达式树中的代码进行编辑和运算。 这样能够动态修改可执行代码、在不同数据库中执行 LINQ 查询以及创建动态查询。
好不好玩?
表达式树还能用于动态语言运行时 (DLR) 以提供动态语言和 .NET Framework 之间的互操作性,同时保证编译器编写员能够发射表达式树而非 Microsoft 中间语言 (MSIL)。
哪里有应用?
ORM框架、工作流框架等,使用到 Lambda 的代码。。。动态执行代码、动态组装代码等。
创建表达式树
创建表达式树有两种方式:通过 lambda 表达式、通过 API。
创建表达式树的意思是,在此之前已经编写好每个结点,最后使用代码将所有结点组合起来,生成表达式树。
示例(通过API创建表达式树)
``` ParameterExpression a = Expression.Parameter(typeof(int), "i"); ParameterExpression b = Expression.Parameter(typeof(int), "j"); Expression r1 = Expression.Multiply(a, b); //乘法运行 ParameterExpression c = Expression.Parameter(typeof(int), "x"); ParameterExpression d = Expression.Parameter(typeof(int), "y"); Expression r2 = Expression.Multiply(c, d); //乘法运行 Expression result = Expression.Add(r1, r2); //相加 //以上代码产生结点 //生成表达式 Expression
上面关于表达式树的代码很多,以下这一步叫生成/创建表达式树。
Expression
以下这句叫执行表达式树
var com = func.Compile();
其它代码是用于生成表达式树结点/逻辑。
回归正题,创建表达式树的两种方法。
lambda 创建表达式树
上面的表达式树示例,是用于生成
( i * j ) + ( x * y )
但是就这么简单的操作,要写这么长,实在不合理。
而通过 lambda ,可以这样写
Expression
如果使用 lambda 生成表达式树, lambda 只能使用单行语句,不能使用 if、for等语句。
具体关于 Lambda 的表达式树,后面其它文章有说明。
通过 API 创建表达式树
就是这样
Expression
两种方式左边的都是一样的,区别在于等号右边。
Expression< TDelegate >
上面示例的最终结果都是生成
Expression
func 是表达式树变量。
我们可以了解以下表达式树具有的方法和属性。
用于生成表达式树结点的,是 Expression 类型。
那么,创建的表达式树 func ,是 Expression
定义如下
public sealed class Expression
具有方法如下
由于 Expression
好了,以上权当小笔记,备忘,目前先用不上,后面慢慢来使用。
解析/执行表达式树
创建表达式树后,就要执行表达式树。
在此之前,你需要了解 委托 Delegate,Func,Action,以及他们中间的关系。
执行表达式树是这样子的
Expression
func 只是一个表达式树,我们把表达式树构建好后,“要将表达式树转为代码”,使用
.Compile() 方法,可以将表达式树生成一个 委托(例如上面的 com)。
为了简洁上面使用了 var,实际上是这样的
Func
四个参数,一个返回值。
var runRasult = com(12, 12, 13, 13);
C#里有语法糖,对委托可以这样写
Expression
以后后面都是这样写了,能够缩成一行的代码,就没必要写出两行。
在 Vs 里面调试和查看表达式树,可以看这里
https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/concepts/expression-trees/debugging-expression-trees-in-visual-studio
初学者不必纠结于这些,了解一下本文内容,记一下概要信息即可。
一个逗逗的大学生
软件开发
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。