2009-10-19 3 views
6

J'ai lu plusieurs articles et plusieurs stackoverflow.com sur l'arbre d'expression. Il est difficile de comprendre mon cerveau.Bit Curieux de comprendre l'arbre d'expression dans .NET

Questions:

1) Comme DOM (Document Object Model), il est une représentation en mémoire de la logique?

2) Quelqu'un a expliqué qu'il s'agit d'un mécanisme pour traduire un code exécutable en données, en l'utilisant, nous pouvons produire une structure de données représentant le code. Cela signifie-t-il que les arbres d'expression sont utilisés pour concevoir un modèle défini par l'utilisateur?

3) La plupart des exemples montrent Expression tree en conjonction avec Func<> delegate ou autres délégués, Donc en utilisant delegate et autre construction de programmation ne pouvons pas obtenir la même chose que l'arbre d'expression sert.

Une explication compréhensible par les débutants est très appréciée.

+0

BTW. les arbres d'expression ne sont pas spécifiques à C#, j'ai donc changé de sujet. –

Répondre

16

L'arbre d'expression représente un arbre de syntaxe d'une seule expression.

Chaque noeud d'arborescence représente une référence ou une opération de membre d'objet constant.

E.g.pour l'expression 2 + 3 nous pouvons construire et l'arbre d'expression:

Expression.MakeBinary(
    ExpressionType.Add, 
    Expression.Constant(2), 
    Expression.Constant(3)); 

Le plus important de ces arbres est l'expression qui permet d'écrire l'expression sous une forme lisible agréable rappelant les fonctions lambda de TDelegate correspondant de signature. Voici ex

Expression<Func<int>> sum =() => 2 + 3; // much nicer, eh? 

Mais Expression n'est pas déléguée, car elle n'a pas pu être exécutée directement.

Au lieu de cela, il peut être traversé, par ex. avec l'objet visiteur pour construire une représentation exécutable. Les exemples pourraient être une construction de délégué avec Expression.Compile() ou une requête SQL construite à partir d'une requête LINQ en utilisant CompiledQuery.Compile() etc.

Une autre application utile des arbres d'expression est de les utiliser pour représenter des membres d'objets qui nécessiteraient sinon l'utilisation de Réflexion. La réflexion utilise des chaînes pour représenter les noms des membres et ne fait aucune vérification lors de la compilation. Les arbres d'expression sont vérifiés, donc un peu moins d'erreurs pourraient être faites.

PropertyInfo prop1 = typeof(MyClass).GetProperty("Value"); 

Expression<Func<MyClass, int>> expr = mc => mc.Value; 
PropertyInfo prop2 = (mc.Body as MemberExpression).Member as PropertyInfo; 
+1

+1 très bonne explication :-) –

3

Here's an article ce qui explique les bases ...

En bref:

1) En gros, oui il y a une représentation en mémoire de la logique.

2) Il peut être compilé en MSIL (ou, comme dans le cas de LINQ-to-SQL aussi vers d'autres langages).

3) Les délégués Func <> sont utilisés parce qu'ils sont utilisés pour représenter l'expression en tant que fonction appelable (qui est compilée en interne en tant que MSIL).

+0

en réalité cependant, les Func <> (et les délégués Action <> correspondants) sont juste là pour plus de commodité. Vous pouvez utiliser n'importe quel type de délégué –

+1

OMG! C'est le tutoriel où j'ai compris Expression Trees !! –

1

Je ne suis pas un expert sur le sujet mais j'essaierai d'ouvrir la voie.

Pensez à expression-arbres comme une réflexion typée. C'est un moyen facile de savoir ce qu'est une fonction, comme ce qui est l'opérande, les paramètres et d'autres choses.

Ainsi,
1) Je dirais que oui.
2) Pas exactement ... vous devriez d'abord apprendre la fonction (moi aussi) et ensuite trouver à quoi ça sert. Générez-vous du code? cela pour moi pourrait être une caractéristique très utile de l'expression-arbres
3) Expression-tree c'est une nouvelle fonctionnalité mais il n'y a rien que vous ne pouviez pas faire auparavant. Maintenant, c'est plus facile.

Il y a un bon article here qui explique les bases.

+0

@Lucero, je suis content que nous avons tous deux posté le même lien :) – sebagomez

+0

Tout le monde aime les principes de base de l'arbre d'expression de Charlie: D –

10

Expression est un moyen souple d'exprimer des opérations de code en tant que modèle d'objet. Ceci est étendu beaucoup plus en 4.0, mais c'est une zone que j'utilise un lot; J'ai quelques points de blog here, ou une autre tentative d'expliquer tout cela sur InfoQ. J'ai également présenté ce sujet quelques fois - peut-être essayer le téléchargement here (mais il ne sera pas beaucoup de sens sans les mots, désolé).

Je vais être honnête; ce n'est pas un sujet simple - mais c'est énormément puissant quand on le grok. D'après ce qui précède, je commencerais probablement avec l'InfoQ.

2

J'ai essayé de répondre à des questions comme la vôtre sur le blog C# FAQ dans l'article de blog suivant: Generating Dynamic Methods with Expression Trees in Visual Studio 2010. Donc, oui, c'est en mémoire. Je ne comprends pas ce que vous entendez par "modèles définis par l'utilisateur", mais vous pouvez l'utiliser pour écrire du code dynamique. Et non, vous ne pouvez pas remplacer les ET par des délégués, car vous ne pouvez pas modifier les délégués lors de l'exécution. La seule substitution peut être MSIL, ce qui est beaucoup plus difficile à lire et à écrire.