En stockant un lambda comme un délégué, vous stockez une instance spécifique d'un délégué qui effectue une certaine action. Il ne peut pas être modifié, il suffit de l'appeler. Une fois que vous avez votre délégué, vous avez des options limitées pour inspecter ce qu'il fait et ainsi de suite.
En stockant un lambda sous forme d'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. Elle peut même être compilée en un délégué pour 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 elle le fait. C'est quelque chose qu'un fournisseur de requêtes peut utiliser pour comprendre et traduire une expression dans un autre langage (comme é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 en utilisant des expressions que d'émettre le code. Vous pouvez considérer votre code à un niveau supérieur comme des expressions, ce qui est très similaire à la façon dont un compilateur voit le code, au lieu d'aller à un niveau inférieur et de voir votre code comme des instructions IL.
Ainsi, 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 seront affectées si vous exécutez des expressions compilées par rapport à une méthode ordinaire ou un délégué anonyme. Mais ce n'est peut-être pas un problème, car les autres avantages de l'utilisation des expressions peuvent être importants pour vous.