2009-10-19 8 views
6

He leído varios artículos y varios stackoverflow.com mensajes sobre el árbol de expresiones. Me duele el cerebro entender.Bit Curioso de entender Expression Tree en .NET

Preguntas:

1) Al igual que DOM (Document Object Model), que es una representación en memoria de la lógica?

2) Alguien explicó que es un mecanismo para traducir un código ejecutable en datos, y al usarlo podemos generar una estructura de datos que represente el código.

¿Significa que los árboles de expresión se usan para diseñar un patrón definido por el usuario?

3) La mayoría de los ejemplos muestran el árbol de expresiones junto con el delegado Func<> u otros delegados, por lo tanto, mediante el delegado y otras construcciones de programación no podemos lograr lo mismo que sirve el árbol de expresiones.

Explicación comprensible para principiantes es muy apreciada.

+0

BTW. los árboles de expresión no son específicos de C#, así que cambié tu tema. –

Respuesta

16

El árbol de expresiones representa un árbol de sintaxis de una sola expresión.

Cada nodo de árbol representa una constante, referencia u operación de miembro de objeto.

E.g.para la expresión 2 + 3 podemos construir y árbol de expresión:

Expression.MakeBinary(
    ExpressionType.Add, 
    Expression.Constant(2), 
    Expression.Constant(3)); 

El más importante de estos árboles es la expresión que permite la expresión de escribir en forma legible agradable recordando las funciones lambda de TDelegate firma coincidente. Aquí está el ex

Expression<Func<int>> sum =() => 2 + 3; // much nicer, eh? 

Pero expresión no es delegar, ya que no podría ser ejecutado directamente.

En su lugar, se puede atravesar, p. con el objeto visitante para construir alguna representación ejecutable. Algunos ejemplos podrían ser la acumulación delegado con Expression.Compile() o consulta SQL construida a partir de consulta LINQ utilizando CompiledQuery.Compile(), etc.

Otra aplicación útil de los árboles de expresión está usando para representar a los miembros de objetos que de otro modo requerirían el uso de Reflexión. Reflection utiliza cadenas para representar nombres de miembros y no realiza comprobaciones en tiempo de compilación. Los árboles de expresión se verifican, por lo que se podrían cometer menos errores.

PropertyInfo prop1 = typeof(MyClass).GetProperty("Value"); 

Expression<Func<MyClass, int>> expr = mc => mc.Value; 
PropertyInfo prop2 = (mc.Body as MemberExpression).Member as PropertyInfo; 
+1

1 explicación muy buena :-) –

3

Here's an article que explica los conceptos básicos ...

En resumen:

1) Básicamente, sí se trata de una representación en memoria de la lógica.

2) Se puede compilar en MSIL (o, como en el caso de LINQ-to-SQL también en otros idiomas).

3) Los delegados Func <> se utilizan porque se utilizan para representar la expresión como función invocable (que se compila internamente como MSIL).

+0

en realidad, el Func <> (y los correspondientes delegados de Acción <>) están ahí para su conveniencia. Puede usar cualquier tipo de delegado –

+1

OMG! ¡Ese es el tutorial donde entendí Expression Trees! –

1

No soy un experto en el tema, pero intentaré despejar el camino.

Piense en los árboles de expresión como un reflejo mecanografiado. Es una forma fácil de conocer lo que tiene una función, como cuál es el operando, los parámetros y demás.

Por lo tanto,
1) Yo diría yeap.
2) No exactamente ... primero debes aprender la función (yo también) y luego descubrir para qué sirve. ¿Estás generando código? eso para mí podría ser una característica muy útil de la expresión-trees
3) Expression-tree es una característica nueva pero no hay nada que no puedas hacer antes. Ahora es más fácil.

Hay un buen artículo here que explica los conceptos básicos.

+0

@Lucero, me alegro de que tanto registró el mismo enlace :) – sebagomez

+0

Todo el mundo ama Fundamentos árbol de expresión de Charlie: D –

10

Expression es una manera versátil de expresar las operaciones de código como un modelo de objetos. Esto se extiende mucho más en 4.0, pero esta es un área que utilizo un lote; Tengo algunos puntos de blog here, u otro intento de explicarlo todo en InfoQ. También he presentado este tema algunas veces, quizás intente descargar here (pero no tendrá tanto sentido sin las palabras; lo siento).

Seré honesto; no es un tema simple, pero es enormemente potente cuando lo asimilas. De lo anterior, probablemente comenzaría con InfoQ.

2

he tratado de responder a preguntas como la suya en C# FAQ del blog en la siguiente entrada en el blog: Generating Dynamic Methods with Expression Trees in Visual Studio 2010. Entonces, sí, está en la memoria. No entiendo lo que quiere decir con "patrones definidos por el usuario", pero puede usarlo para escribir código dinámico. Y no, no puede reemplazar ET con delegados, ya que no puede modificar delegados en tiempo de ejecución. La única sustitución puede ser MSIL, que es mucho más difícil de leer y escribir.