¿Cuáles son las diferencias entre los árboles de expresión y CodeDom? ¿Qué debería usar para qué escenario?C# 4.0: Árboles de expresión frente a CodeDom
Respuesta
Los árboles de expresiones tienen mucho en común con (por ejemplo) un AST. No se asigna directamente al código, pero es muy fácil de construir a partir de algoritmos. Por ejemplo, si se está analizando una fórmula:
((a + 2)/b)
es decir:
ParameterExpression a = ..., b = ...
var body = Expression.Divide(
Expression.Add(a, Expression.Constant(2)),
b);
var lambda = Expression.Lambda(body,a,b); // optionally with generics
De hecho, me han hecho exactamente esto, usando un analizador que construir un árbol de objetos, con la generación de objetos la expresión completa a través de una implementación de "visitante". En .NET 4.0, la compatibilidad más rica con el árbol de expresiones hace posible admitir la mayoría de los escenarios y compilarlos según demanda.
Otro uso de las expresiones clave es que se puede deconstruir en tiempo de ejecución, por lo en el código es posible que tenga:
Foo(x => x.SomeMethod(1, "abc"));
y extraer el SomeMethod
método de información, y 1
"abc"
etc.
CodeDOM asigna al código . Se trata de sentencias, etc., muy, similar a cómo escribirías el código normal. El uso más común de coddedom es para la generación de código, como parte de las herramientas. Usted puede usarlo para la compilación dinámica, pero para ser honesto, es más difícil. No soy un fan La buena característica es que un árbol codificado podría funcionar en para varios idiomas.
Otro contendiente aquí debe ser DynamicMethod
y/o ILGenerator
. Este no incluye en una AST (expresión) y no se puede usar para generar código fuente (codificado), pero permite el acceso completo a las herramientas MSIL. Por supuesto, también requiere que piense en términos de pilas, etc., pero es muy eficiente y efectivo para meta-programación.
Si es demasiado ILGenerator
núcleo duro, y CodeDOM es un PITA, a continuación, otra opción es la generación de tiempo de ejecución de código como una cadena. Luego, pase eso a través del CSharpCodeProvider
para compilarlo. Hay partes del tiempo de ejecución del núcleo que hacen esto (XmlSerializer
IIRC).
Entonces, para resumir:
- meta-programación:
ILGenerator
oCSharpCodeProvider
; TambiénExpression
en 4.0 (pero esto es bastante limitada en 3.5) - manejo de AST:
Expression
- análisis en tiempo de ejecución:
Expression
- de generación de código en varios idiomas: Código-dom
Los árboles de expresiones se utilizan para generar expresiones. Creando código fuente en tiempo de ejecución. CodeDom se utiliza para compilar el código fuente. Tiene que existir antes de que puedas construirlo. Los árboles de expresión son más flexibles, pero mucho más difíciles de usar.
Si desea agregar scripts a su aplicación, use CodeDom. Si quieres hacer una reflexión muy avanzada y lo que te gusta, usa árboles de expresión, pero no lo recomiendo.
- 1. Construyendo árboles de expresión
- 2. Convertir árboles de expresión
- 3. serializar y deserializar expresión Árboles en C#
- 4. Árboles: Listas vinculadas frente a matrices (Eficiencia)
- 5. ¿Los árboles de expresión LINQ son árboles apropiados?
- 6. Crear un Func <> dinámicamente - Lambdas frente a árboles de expresión
- 7. C# CodeDom Propiedad automática
- 8. SQL Server Compact 4.0 frente a SQLite
- 9. Variable local y árboles de expresión
- 10. Unidad de árboles de expresión Pruebas
- 11. ¿Están terminados los árboles de expresión de LINQ Turing?
- 12. Aprendizaje de árboles de expresión en LINQ
- 13. Uso práctico de árboles de expresión
- 14. ¿Quizás la mónada usa árboles de expresión?
- 15. Asignación en árboles de expresión .NET 3.5
- 16. esperan declaración frente a la expresión
- 17. Generar propiedades automáticas de C# con Codedom
- 18. Heurística para "esto" y cierres ¿está bien? (árboles de expresión)
- 19. Microsoft Roslyn vs CodeDom
- 20. el enlace de parámetros en los árboles de expresión
- 21. Restricción de criterios de NHibernate frente a Expresión
- 22. LINQ: Notación de puntos frente a Expresión de consulta
- 23. Árboles de expresión de compilación para representar if-else
- 24. CodeDom - Llame a un método genérico
- 25. Detección confiable de clases generadas por el compilador en árboles de expresión C#
- 26. C++ int frente a largo
- 27. C# parámetros frente a devoluciones
- 28. C# Árboles binarios y diccionarios
- 29. ¿Cuál es el mejor recurso para aprender árboles de expresión de C# en profundidad?
- 30. árboles N-arios en C