c# - 'Data Structure' 和 'compiled code' 有什么区别

标签 c# expression-trees

Expression trees purpose:

Expression tree must be compiled before it can be used. This is because expression tree is actually a data structure, not compiled code. Why? Because this code is expected to be used across wire, or – in other words – in other processes (running possibly on other computers).

发件人: http://geekswithblogs.net/Martinez/archive/2009/06/29/understanding-expression-trees.aspx

“数据结构”和“编译代码”之间有什么区别;编译后的代码在 C# 中看起来如何?!通过这篇文章,我了解到不包含 Array 或 List 的每一行都是编译代码(例如:“Human H1=new Human(18);”)。

请不要用例子解释什么是表达式树,我想要一个关于这个问题的明确答案。

谢谢你的时间

最佳答案

如果不先编译就无法执行表达式树,因为表达式树有不同的用途:它们作为可执行代码的灵活蓝图,而不是可执行代码本身(with 相当不灵活)。

表达式树是一种数据结构,它在高于代码本身的抽象级别描述代码(已编译或未编译)。与代码不同,数据结构可以被操纵以形成描述其他代码段的不同结构。与数据结构不同,可以对代码求值以产生结果。

考虑这个例子:

Expression p1 = Expression.Parameter(typeof(int), "a");
Expression p2 = Expression.Parameter(typeof(int), "b");
Expression expr = Expression.Add(p1, p2);

它显示了正在创建的表达式 expr,描述了一个简单的表达式树 a+b。至此,我们有了一个树状数据结构,其中包含三个节点——两个节点代表参数,一个节点代表加法。我们可以用表达式树做很多事情,比如检查它的内容,找到它的返回类型,等等。我们甚至可以操纵它的结构来基于它创建其他表达式:例如,我们可以添加第三个参数,并创建 a+b+c,如下所示:

Expression p3 = Expression.Parameter(typeof(int), "c");
expr = Expression.Add(expr, p3);

然而,我们不能做的一件事是将两个整数值传递给它并获得它们的总和:表达式树不提供评估它们的方法。为此,您需要真正的代码,而不是代码描述。

表达式树提供了一种通过编译将代码描述转换为代码的方法。一旦你将表达式树转换为 lambda 并对其调用 Compile() 方法,你就会得到编译后的 CIL。看起来像这样的代码:

ldarg.0
ldarg.1
add
ret

此代码可以传递两个值进行评估,它会将总和返回给您。然而,一些信息在翻译中丢失了:具体来说,参数名称 ab 不再存在于编译代码中:它们不是执行计算所必需的,所以他们已经被淘汰了。

关于c# - 'Data Structure' 和 'compiled code' 有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13071144/

相关文章:

c# - 如何在 Entity Framework Code First 中的子集合上创建表达式

javascript - anchor 标记上的 JQuery click() 未从 WebBrowser 控件内的注入(inject)脚本触发

c# - Xamarin - 尝试显示 toast 或从服务启动事件时出现空引用异常

c# - 使用 Oledb、C#、Dapper 的标准表达式中的数据不匹配

c# - 使用 C# 运行交互式命令行 exe

c# - 如何获取给定类型的强类型属性名称?

c# - 表达式树中的绑定(bind)参数

java - 如何在java中绘制自动机

c# - 如何等待异步委托(delegate)

c# - Expression.Assign 将 Expression.Call 分配给 Expression.Variable