Un malentendu dans les arbres d’expression compilés?

.net-4.0 c# expression-trees

Question

J'ai cette expression:

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

entrez la description de l'image ici

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

// permet de: tester

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

Je veux poser des questions sur le .Compile()

Qu'est-ce qu'il compile? Et quelle est la différence entre la première exécution et les exécutions ultérieures ...?

Compiler devrait être quelque chose qui arrive une fois et ne se reproduise plus plus tard ....

Qu'est-ce / comment ça m'aide?

Réponse acceptée

Lorsque vous construisez l'arborescence d'expression au moment de l'exécution, aucun code n'est émis. C'est un moyen de représenter le code .NET au moment de l'exécution.

Une fois que vous avez appelé la méthode .Compile sur l'arborescence d'expression, le code IL réel est émis pour convertir cette arborescence d'expression en un délégué ( Func<string, bool> dans votre cas) que vous pouvez appeler à l'exécution. Ainsi, le code représenté par cette arborescence d’expression ne peut être exécuté qu’après sa compilation.

Appeler Compile est une opération coûteuse. Fondamentalement, vous devriez l'appeler une fois, puis mettre en cache le délégué résultant que vous pourriez utiliser pour appeler le code plusieurs fois.


Réponse populaire

Compile() prend l'arborescence d'expression (qui est une représentation de données d'une logique) et la convertit en IL, qui peut ensuite être exécutée directement en tant que délégué.

La seule différence entre la première exécution et les exécutions ultérieures est la possibilité que Compile() ne déclenche pas la compilation JIT de IL au code de processeur natif. Cela peut arriver lors de la première exécution.




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi