Quelle est la différence entre Expression et Func? La même tâche peut être atteinte par les deux. Alors, quelle est la difference?différence entre Expression et Func
Répondre
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; };
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.
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é.
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()
.
- 1. Différence entre -Wconversion entre gcc et g ++
- 2. Différence entre Where et Single
- 3. Linq Func/Expression d'évaluation locale
- 4. Différence entre sqlreader et
- 5. VBA: Différence entre & et +
- 6. Différence entre référence et & *?
- 7. différence entre String.Empty et ""
- 8. Quelle est la différence entre Func <T, TResult> et Converter <TInput, TOutput>?
- 9. Comment créer et renvoyer une expression <Func
- 10. différence entre eq et == dans JSP
- 11. Différence entre DECLARE_DYNAMIC et DECLARE_DYNCREATE?
- 12. Différence entre JNLP et JavaFX
- 13. Différence entre Session et HttpContext.Current.Session
- 14. Différence entre (++ i) et (i ++)
- 15. Différence entre tortoisesvn et CollabNetSubversion
- 16. Différence entre l'interruption et l'événement
- 17. différence entre contenttypeorder et uniquecontenttypeorder
- 18. différence entre openTK et cloo?
- 19. Différence entre Server.MapPath et Page.MapPath
- 20. Différence entre java.awt. * Et java.awt.event. *
- 21. Différence entre Html.RenderAction et Html.Action
- 22. Différence entre URI et URL
- 23. Différence entre JAVA_OPTS et JAVA_TOOL_OPTIONS?
- 24. différence entre cela et $ (this)
- 25. Différence entre IQueryable et Queryable
- 26. différence entre lcds et fds
- 27. Différence entre onMouseOver et onMouseEnter
- 28. différence entre system.out et system.err
- 29. Différence entre ValidatorForm et DynaValidatorForm
- 30. Python: Différence entre `is` et` == `?