Comprendre les expressions Lambda et les délégués
J'ai essayé de comprendre cela pour très peu de temps (lire en ligne blogs et articlaes), mais jusqu'à présent infructueuses.
Ce sont les délégués? Quelles sont les Expressions Lambda? Avantages et inconvénients des deux? Possible les meilleures pratiques d'utilisation de l'un ou de l'autre?
Merci d'avance.
source d'informationauteur user279521
Vous devez vous connecter pour publier un commentaire.
Délégués sont des méthodes que vous pouvez utiliser comme variables, comme les chaînes, etc. Par exemple, vous pouvez déclarer un délégué de la méthode avec un seul argument:
Il ne fait rien, un peu comme une interface. Si vous avez une méthode dans une classe avec un argument comme ceci:
correspondances la signature du délégué, et peut donc être affectée à une variable de ce type:
Ceux-ci peuvent ensuite être passés comme arguments des méthodes et des invoquée, comme suit:
Ce sera de sortie
Hello!
.Les expressions Lambda sont un raccourci pour la
DoStuff(PrintString)
de sorte que vous n'avez pas à créer une méthode pour chaque délégué variable que vous allez utiliser. Vous 'créer' une méthode temporaire qui est passée à la méthode. Il fonctionne comme ceci:Les expressions Lambda sont juste un aperçu, vous pouvez tout aussi bien créer une autre méthode et de la transmettre. J'espère que vous comprenez mieux maintenant 😉
Délégué est un objet qui contient une référence à une fonction. Plusieurs délégués peuvent point à la même fonction. Un délégué's type définit l'empreinte d'une fonction elle peut.
Expression Lambda est une fonction qui n'a pas de nom. La seule façon de l'exécution de cette fonction est d'avoir un délégué pointant vers la fonction. Les expressions Lambda sont généralement définies dans le lieu où vous avez besoin d'un délégué à une fonction avec une empreinte donnée. Cela est utile pour rendre le code moins verbeux et en même temps plus descriptif et flexible
Je vous suggère d'utiliser un nom de fonction et d'un délégué à chaque fois que vous avez un peu de code qui va être appelé à partir de différents endroits. Un exemple courant est un écouteur d'événement que vous souhaitez joindre à plusieurs producteurs d'événements.
Un autre point à envisager la rédaction d'une fonction distincte est la complexité du code. Il ne va pas aider quelqu'un, si vous écrivez un programme tout entier à l'intérieur d'une expression lambda.
D'autre part, vous avez souvent besoin de quelques trivial de traitement que vous voulez être exécuté dans un rappel. C'est le point où vous pourriez amour les expressions lambda.
Ce qui est très agréable sur les expressions lambda, qu'ils héritent de la portée qu'ils ont été définis, de sorte que vous pouvez facilement vos variables à l'intérieur de l'expression lambda, et passent donc beaucoup de l'info à l'intérieur. Vous devez être prudent, cependant, consultez la section Remarques de
cette article.
Labdas sont brillants en conjonction avec LINQ.
Pour conclure, je cite encore un autre doit-lire l'article msdn:
Personne n'a mentionné les délégués anonymes. Vous pouvez créer des délégués à la volée, sans avoir à déclarer:
Qui est juste une version plus détaillée de la lambda syntaxe:
Également noter que le lambda de la syntaxe est plus agressif que l'inférence de type. Une autre différence est que le lambda de la notation peut être utilisée pour déclarer des arbres d'expression:
Auquel cas ce que vous obtenez n'est pas une fonction mais une arbre d'analyse que vous pouvez examiner au moment de l'exécution. C'est la façon dont les requêtes linq construire leurs sql, par exemple.
modifier
Plus directement répondre à la question de savoir quand utiliser l'un ou de l'autre:
Vous aurez rarement besoin de déclarer un nouveau type de délégué, mais il est parfois utile. Le cadre fournit plusieurs
Func<>
types, avecAction<T>
etPredicate<T>
qui sont généralement tout ce que vous avez besoin.Lors de la création d'une fonction "à la volée", il n'y a aucun avantage à utiliser le délégué anonyme syntaxe au lieu de le lambda de la syntaxe. Depuis le lambda syntaxe est plus concis et le type déduit, préférer.
Délégué est juste le pointeur de fonction. C'est un peu comme une "variable", où vous pouvez enregistrer l'adresse d'une autre fonction qui sera appelée à
Les Expressions Lambda est trop un délégué, qui a simplifié la syntaxe et peut "créer" fonctions "inline".
Si l'exemple précédent serait appelée à l'aide de lambda manière suivante.
Il y a une différence importante, c'est là où nous pouvons utiliser lamda que délégué.
Le cadre équivalent de délégué est:
Func<int>
Mais vous ne pouvez pas créer de nouvelle instance de délégué/func paramétrée à partir de la méthode.
mais, avec
lambda
vous pouvez obtenir délégué pour la méthode ci-dessus.mais pour le délégué de l'instanciation, nous ne pouvons pas faire comme ci-dessous
Avec lambda, nous pouvons obtenir des pointeurs vers des méthodes qui ne correspond pas à "Func" ou d'autres variantes.
Comme les autres ont dit, les lambdas sont une syntaxe pour créer délégués en ligne et de façon anonyme. Une chose que vous pouvez faire avec les lambdas n'est pas possible avec les fonctions traditionnelles sont des fermetures. De cette façon, vous pouvez créer des fonctions lors de l'exécution avec les informations d'exécution:
De cette façon, mystring est incorporé dans la délégué et peut être utilisé comme une variable.