2010-06-26 14 views

Respuesta

13

Expression trees son datos representaciones de la lógica, lo que significa que pueden ser examinados en el momento de la ejecución por cosas como los proveedores de LINQ. Pueden averiguar qué significa el código y, posiblemente, convertirlo en otra forma, como SQL.

La familia de tipos Func, sin embargo, son solo delegados. Terminan como IL normal, que se puede ejecutar directamente, pero no (fácilmente) examinar. Tenga en cuenta que puede compilar árboles de expresiones (bueno, Expression<T> y LambdaExpression) en delegados y ejecutarlos dentro del código administrado también, si es necesario.

Se puede construir hasta árboles de expresión de forma manual utilizando los métodos de fábrica en la clase de expresión, pero por lo general sólo tiene que utilizar el hecho de que C# puede convertir Expresiones Lambda en ambos árboles de expresión y delegados normales:

Expression<Func<int, int>> square = x => x * x; 
Func<int, int> square = x => x * x; 

Tenga en cuenta que existen limitaciones sobre las expresiones lambda que pueden convertirse en árboles de expresiones. Lo más importante, sólo se lambdas que consiste en una sola expresión (en lugar de un cuerpo de la declaración) se puede convertir:

// Compile-time error 
Expression<Func<int, int>> square = x => { return x * x; }; 
// Works fine 
Func<int, int> square = x => { return x * x; }; 
3

La expresión se puede generar en tiempo de ejecución, no funciona (a menos que utilice la emisión de reflejo). Una vez que construye el árbol de expresiones, puede compilarlo y convertirlo en un puntero de función que puede invocarse. Func es un puntero a alguna función ya existente que ya no se puede modificar mientras Expression represente el código de alguna función que no existe hasta que la compile.

0

que suelen utilizar expresiones cuando se desea preservar los la semántica del código para que pueda traducir ella. Es decir, las expresiones le permiten tratar el código como datos. Si el código no necesita tratarse como datos (es decir, no está planeando almacenarlo o traducirlo), usar un Func es apropiado.

7

No es cierto que "ellos hacen lo mismo". Expression describe su intento de una manera que se puede interpretar en tiempo de ejecución; es, si lo desea, la receta. Una función es un delegado opaco, que no puede inspeccionar; se puede usar como una caja negra. Comparado con una receta, es una especie de auto-chef que no te deja ver lo que hace: darle un poco de pan y algo de pollo, cierra los ojos y te da un emparedado, pero nunca llegas a saber cómo.

Discuto esto más aquí: Explaining Expression, pero tener la receta es la clave para LINQ, RPC, etc. Y por supuesto, si tienes la receta puedes hacer tu propio chef, a través del Expression.Compile().

Cuestiones relacionadas