2010-06-26 6 views

Répondre

13

Expression trees sont données représentations de la logique - ce qui signifie qu'ils peuvent être examinés au moment de l'exécution par des choses comme les fournisseurs LINQ. Ils peuvent déterminer ce que le code signifie et éventuellement le convertir en une autre forme, telle que SQL.

La famille de types Func ne sont que des délégués. Ils se terminent par une IL normale, qui peut être exécutée directement, mais pas (facilement) examinée. Notez que vous pouvez compiler des arbres d'expression (bien, Expression<T> et LambdaExpression) dans des délégués et les exécuter dans le code managé, si vous en avez besoin.

Vous pouvez construire des arbres d'expression manuellement en utilisant les méthodes d'usine dans la classe d'expression, mais en général vous suffit d'utiliser le fait que C# peut convertir lambda expressions dans les deux arbres d'expression et les délégués normaux:

Expression<Func<int, int>> square = x => x * x; 
Func<int, int> square = x => x * x; 

Notez qu'il existe des limitations sur lesquelles les expressions lambda peuvent être converties en arbres d'expression. Plus important encore, que lambdas constitué d'une seule expression (plutôt que d'un corps de déclaration) peut être converti:

// Compile-time error 
Expression<Func<int, int>> square = x => { return x * x; }; 
// Works fine 
Func<int, int> square = x => { return x * x; }; 
3

L'expression peut être construite au moment de l'exécution, ne fonctionne pas (sauf si vous utilisez la réflexion). Une fois que vous avez construit l'arbre d'expression, vous pouvez le compiler et le transformer en un pointeur de fonction qui peut être invoqué. Func est un pointeur vers une fonction déjà existante qui ne peut plus être modifiée tandis que Expression représente le code d'une fonction qui n'existe pas jusqu'à ce que vous la compiliez.

0

Vous utilisez habituellement des expressions lorsque vous souhaitez conserver la sémantique du code afin que vous puissiez traduire il. Autrement dit, les expressions vous permettent de traiter le code comme des données. Si le code n'a pas besoin d'être traité comme des données (c'est-à-dire que vous n'avez pas l'intention de le stocker ou de le traduire), alors utiliser un Func est approprié.

7

Il est pas vrai que « ils font la même chose ». Expression décrit votre intention d'une manière qui peut être interprétée à l'exécution - c'est, si vous le souhaitez, la recette. Une fonction est un délégué opaque, que ne peut pas être être inspecté - il peut être utilisé comme une boîte noire. Par rapport à une recette, c'est une sorte d'auto-chef qui ne vous laisse pas voir ce qu'il fait: donnez-lui du pain et du poulet, fermez les yeux et il vous donne un sandwich, mais vous ne savez jamais comment. J'en parle plus ici: Explaining Expression, mais avoir la recette est la clé pour LINQ, RPC, etc. Et bien sûr, si vous avez la recette, vous pouvez faire votre propre chef, via Expression.Compile().