C # 4.0: Arbres d'expression vs CodeDom

c# codedom expression-trees

Question

Quelles sont les différences entre les arbres d'expression et CodeDom? Que devrais-je utiliser pour quel scénario?

Réponse acceptée

Les arbres d'expression ont beaucoup en commun avec (par exemple) un AST . Il ne mappe pas directement au code, mais se prête très bien à la construction à partir d'algorithmes. Par exemple, si vous analysez une formule:

((a + 2) / b)

C'est:

((a + 2) / b)

En fait, je l’ai fait exactement en utilisant un analyseur qui construit une arborescence d’objets, les objets générant l’expression complète via une implémentation "visiteur". Dans .NET 4.0, la prise en charge plus riche de l'arborescence des expressions permet de prendre en charge la plupart des scénarios et de la compiler à la demande.

Une autre utilisation clé des expressions est que vous pouvez les déconstruire au moment de l'exécution. Dans votre code, vous pourriez donc avoir:

((a + 2) / b)

et extraire la méthode SomeMethod -info, 1 et "abc" etc.


codedom correspond au code . Il s’agit de déclarations, etc., très similaires à la façon dont vous écrivez du code standard. L'utilisation la plus courante de codedom est la génération de code, dans le cadre de l'outillage. Vous pouvez l' utiliser pour la compilation dynamique, mais pour être honnête, c'est plus difficile. Je ne suis pas fan La fonctionnalité intéressante est qu'un arbre de codedom peut fonctionner pour plusieurs langues.


DynamicMethod et / ou ILGenerator . Cela ne correspond pas à une AST (expression) et ne peut pas être utilisé pour générer du code source (codedom), mais permet un accès complet aux outils MSIL. Bien sûr, cela exige également que vous pensiez en termes de piles, etc., mais c'est très efficace pour la méta-programmation.


Si ILGenerator est trop strict et que codedom est un PITA, une autre option est la génération à l'exécution du code sous forme de chaîne . CSharpCodeProvider ensuite cela via CSharpCodeProvider pour le compiler. Certaines parties du moteur d'exécution le font ( XmlSerializer IIRC).


Donc, pour résumer:

  • méta-programmation: ILGenerator ou CSharpCodeProvider ; aussi Expression dans 4.0 (mais c'est assez limité dans 3.5)
  • manipulation AST: Expression
  • analyse au moment de l'exécution: Expression
  • génération de code en plusieurs langues: code-dom

Réponse populaire

Les arbres d'expression sont utilisés pour construire des expressions. Création du code source à l'exécution. CodeDom est utilisé pour compiler le code source. Il doit exister avant que vous puissiez le construire. Les arbres d’expression sont plus souples, mais beaucoup plus difficiles à utiliser.

Si vous souhaitez ajouter un script à votre application, utilisez CodeDom. Si vous voulez faire une réflexion très avancée et les goûts, utilisez des arbres d'expression, mais je ne le recommande pas.




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