当前位置: 首页 > 编程语言 > C#

C#4.0:表达式树与CodeDom分享

时间:2023-04-10 19:34:41 C#

C#4.0:表达式树与CodeDom表达式树与CodeDom有什么区别?我应该在什么情况下使用哪个?表达式树与(例如)AST有很多共同之处。它不直接映射到代码,但非常适合从算法构建。例如,如果您要解析公式:((a+2)/b)那将是:ParameterExpressiona=...,b=...varbody=Expression.Divide(Expression.Add(a,Expression.常数(2)),b);varlambda=Expression.Lambda(body,a,b);//可选地使用泛型我实际上已经做到了这一点,使用构建对象树的解析器,使用“访问者”实现来生成完整的表达式对象。在.NET4.0中,更丰富的表达式树支持使得支持大多数场景并按需编译成为可能。表达式的另一个关键用途是您可以在运行时解构它们,因此在您的代码中您可能有:Foo(x=>x.SomeMethod(1,"abc"));并提取SomeMethod方法SomeMethod、1和“abc”等代码域映射到代码。这都是关于语句之类的,与您编写常规代码的方式非常相似。编码器最常见的用途是作为工具的一部分用于代码生成。您可以将它用于动态编译,但说实话很难。我不是粉丝。不错的功能是编码树可以适用于多种语言。这里的另一个竞争者应该是DynamicMethod和/或ILGenerator。这不会映射到AST(表达式),也不能用于生成源代码(codedom),但允许完全访问MSIL工具。当然它还需要你考虑堆栈等,但它对于元编程来说非常有效和高效。如果ILGenerator太硬核,而encodeom是一个PITA,另一种选择是将代码运行时生成为字符串。然后通过CSharpCodeProvider进行编译。核心运行时的某些部分可以执行此操作(XmlSerializerIIRC)。总结一下:表达式树用于构建表达式。在运行时创建源代码。CodeDom用于编译源代码。它必须存在才能构建它。表达式树更灵活,但更难使用。如果要将脚本添加到应用程序,请使用CodeDom。如果你想做非常高级的反射之类的,使用表达式树,但我不推荐它。以上就是C#学习教程:C#4.0:表达式树和CodeDom分享所有内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:

猜你喜欢