在.NET 2.0-3.5框架中,当不需要任何类结构来支持轻量级方法时,LCG(即DynamicMethod类)是一种不错的方法。
在.NET 4.0中,表达式树现在支持语句和块,因此似乎提供了足够的功能来构建这种方法可能需要的几乎所有功能,并且与直接发出CIL相比,可以用一种更轻松,更安全的方式来构造它。操作码。 (此声明来自今天的实验,该实验将一些我们最复杂的LCG代码转换为使用表达式树构建和编译。)
那么,为什么有任何理由要在任何新代码中使用LCG?表达式树不能做的任何事情?还是现在是“死”功能?
最佳答案
没有任何中间步骤就直接构造CIL是没有意义的。但是,最好使用您自己的最终针对IL的中间语言。表达式树等还不够-仅是一种语言,而在实现DSL时,您需要许多不同的语义。
您可以轻松地发出不安全的代码(具有许多ldftns等),可以发出尾部调用(不确定是否可以使用表达式),可以对虚拟方法进行非虚拟调用,可以使用标签和跳转有效地构造大型状态自动机,等等。表达式树是如此有限,以至于我根本无法理解如何将它们与原始CIL进行比较。