我有一些关于DynamicMethods、Expression Trees和DLR之间的交互和关系的问题。
我知道LambdaExpression.Compile在内部使用ILGenerator来创建委托。然而,编译后的LambdaExpression和DynamicMethod之间存在一些根本性的区别。例如:
a. DynamicMethods调用速度更快
b. 编译后的LambdaExpressions可以嵌入闭包(非基元值的ConstantExpressions)
c. 编译后的LambdaExpressions没有DeclaringType。
问题:
a. 为什么DynamicMethods调用速度比编译后的LambdaExpressions更快?
b. 编译后的LambdaExpressions有什么特殊之处,使其能够使用闭包?当我使用非ConstantExpression时,表达式树实际上是否生成了一个闭包类?如果是这样,生成的类放在哪里?
c. 编译后的LambdaExpressions在运行时放在哪里?它们的支持是在哪里实现的?它不能仅仅是Reflection.Emit,对吗?
我知道动态关键字实际上只是一个编译器技巧,用于发出CSharp CallSites、Binders等。据我所知,在内部,它们生成Expression Trees,并使用裁剪版的C#编译器。
问题:
a. 生成的表达式树是一般CallSiteBinders的函数,还是Microsoft.CSharp dll中特定实现和用法的函数?
b. 这些表达式树由DynamicExpression节点组成吗?还是其他什么东西?如果是其他东西,为什么?
c. 裁剪版的C#编译器在哪里以及为什么起作用?它与常规调用LambdaExpression.Compile、DynamicMethods或任何类型的IL生成有什么不同?我可以理解CallSiteBinders如何用于构建Expression Trees,但为什么在转换发生后需要C#编译器?一旦它变成Expression Tree(只是一个API),C#与此有什么关系?
DynamicMethod
更快?你的这个说法基于什么依据? - svick