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
此代码可以传递两个值进行评估,它会将总和返回给您。然而,一些信息在翻译中丢失了:具体来说,参数名称 a
和 b
不再存在于编译代码中:它们不是执行计算所必需的,所以他们已经被淘汰了。
关于c# - 'Data Structure' 和 'compiled code' 有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13071144/