¿Árboles de expresión compilados malentendidos?

.net-4.0 c# expression-trees

Pregunta

Tengo esta expresion

Expression<Func<string, bool>> f = s => s.Length < 5;

introduzca la descripción de la imagen aquí

ParameterExpression p = Expression.Parameter (typeof (string), "s");
MemberExpression stringLength = Expression.Property (p, "Length");
ConstantExpression five = Expression.Constant (5);
BinaryExpression comparison = Expression.LessThan (stringLength, five);
Expression<Func<string, bool>> lambda= Expression.Lambda<Func<string, bool>> (comparison, p);

// permite: prueba

Func<string, bool> runnable = lambda.Compile();
Console.WriteLine (runnable ("kangaroo")); // False
Console.WriteLine (runnable ("dog")); //True

Quiero preguntar sobre el .Compile()

¿Qué compila? ¿Y cuál es la diferencia entre la primera ejecución y las posteriores ejecuciones ...?

La compilación debe ser algo que suceda una vez y no vuelva a suceder más tarde ...

¿Qué / cómo me ayuda?

Respuesta aceptada

Cuando se construye el árbol de expresiones en tiempo de ejecución, no se emite ningún código. Es una forma de representar el código .NET en tiempo de ejecución.

Una vez que llame al método .Compile en el árbol de expresiones, se emitirá el código IL real para convertir este árbol de expresiones en un delegado ( Func<string, bool> en su caso) que podría invocar en tiempo de ejecución. Por lo tanto, el código que representa este árbol de expresiones se puede ejecutar solo después de compilarlo.

Llamar a Compile es una operación costosa. Básicamente, debería llamarlo una vez y luego almacenar en caché el delegado resultante que podría usar para invocar el código muchas veces.


Respuesta popular

Compile() toma el árbol de expresión (que es una representación de datos de alguna lógica) y lo convierte a IL, que luego puede ejecutarse directamente como un delegado.

La única diferencia entre la primera ejecución y las posteriores es la posibilidad de que Compile() no active la compilación JIT de IL al código del procesador nativo. Eso puede suceder en la primera ejecución.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow