Alberi di espressione compilati incomprensioni?

.net-4.0 c# expression-trees

Domanda

Ho questa espressione:

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

inserisci la descrizione dell'immagine qui

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);

// lascia: test

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

Voglio chiedere informazioni su .Compile()

Cosa compila? E qual è la differenza tra la prima esecuzione e le esecuzioni successive ...?

Compilare dovrebbe essere qualcosa che accade una volta e non si ripeterà più tardi ....

Cosa / Come mi aiuta?

Risposta accettata

Quando si costruisce l'albero delle espressioni in fase di esecuzione non viene emesso alcun codice. È un modo per rappresentare il codice .NET in fase di runtime.

Una volta chiamato il metodo .Compile delle espressioni, il vero codice IL viene emesso per convertire questo albero di espressioni in un delegato ( Func<string, bool> nel tuo caso) che potresti invocare in fase di runtime. Quindi il codice che questo albero di espressioni rappresenta può essere eseguito solo dopo averlo compilato.

Chiamare compilare è un'operazione costosa. Fondamentalmente dovresti chiamarlo una volta e quindi memorizzare nella cache il delegato risultante che potresti usare per invocare il codice molte volte.


Risposta popolare

Compile() prende l'albero delle espressioni (che è una rappresentazione di dati di qualche logica) e lo converte in IL che può quindi essere eseguito direttamente come delegato.

L'unica differenza tra la prima esecuzione e le esecuzioni successive è la possibilità che Compile() non attivi la compilazione JIT da IL a codice processore nativo. Questo può accadere alla prima esecuzione.



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché