Quel est le but de la classe Expression?

c# expression-trees lambda

Question

Je me demande quelle est exactement la différence entre insérer un délégué dans Expression<> et non?

Je vois que Expression<Foo> est beaucoup utilisé avec LinQ, mais je n’ai pas trouvé d’article expliquant la différence entre cela, et utilisant simplement un délégué.

Par exemple

Func<int, bool> Is42 = (value) => value == 42;

contre.

Expression<Func<int, bool>> Is42 = (value) => value == 42;

Réponse acceptée

En stockant un lambda en tant que délégué, vous stockez une instance spécifique d'un délégué effectuant une action. Il ne peut pas être modifié, vous l'appelez simplement. Une fois que vous avez votre délégué, vous avez peu d'options pour inspecter ce qu'il fait et ce que vous voulez.

En stockant un lambda en tant qu'expression, vous stockez un arbre d'expression qui représente le délégué. Il peut être manipulé pour faire d'autres choses, comme changer ses paramètres, changer le corps et lui faire faire quelque chose de radicalement différent. Il pourrait même être compilé en un délégué afin que vous puissiez l'appeler si vous le souhaitez. Vous pouvez facilement inspecter l'expression pour voir quels sont ses paramètres, ce qu'elle fait et comment. C’est quelque chose qu’un fournisseur de requêtes peut utiliser pour comprendre et traduire une expression dans un autre langage (par exemple, écrire une requête SQL pour un arbre d’expression correspondant).

Il est également beaucoup plus facile de créer un délégué de manière dynamique à l'aide d'expressions que d'émettre du code. Vous pouvez considérer votre code à un niveau supérieur comme des expressions très similaires à la manière dont un compilateur affiche le code au lieu de passer à un niveau inférieur et de le visualiser sous forme d'instructions IL.

Donc, avec une expression, vous êtes capable de faire beaucoup plus qu'un simple délégué anonyme. Bien que ce ne soit pas vraiment gratuit, les performances prendront un coup si vous exécutez des expressions compilées par rapport à une méthode normale ou à un délégué anonyme. Mais cela pourrait ne pas être un problème car les autres avantages d'utiliser des expressions peuvent être importants pour vous.


Réponse populaire

Func<> n'est qu'un type de délégué. Une expression est une représentation d'exécution de l'arborescence complète des opérations qui, éventuellement, peuvent être compilées au moment de l'exécution en un délégué. C'est cette arborescence qui est analysée par des analyseurs d'expression tels que Linq-to-SQL pour générer des instructions SQL ou faire d'autres choses astucieuses. Lorsque vous affectez un lambda à un type d'expression, le compilateur génère cet arbre d'expression ainsi que le code IL habituel. Plus sur les arbres d'expression .



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow