délégué mot-clé vs lambda notation
Une fois qu'il est compilé, est-il une différence entre:
delegate { x = 0; }
et
() => { x = 0 }
?
Vous devez vous connecter pour publier un commentaire.
Une fois qu'il est compilé, est-il une différence entre:
delegate { x = 0; }
et
() => { x = 0 }
?
Vous devez vous connecter pour publier un commentaire.
Réponse courte : non.
Plus de réponse qui peuvent ne pas être pertinentes:
Func
ouAction
), vous obtiendrez un délégué anonyme.Edit:
Voici quelques liens pour les Expressions.
J'aime David réponse, mais je pensais être pédant. La question dit, "une Fois qu'il est compilé" - ce qui suggère que les deux expressions ont été compilé. Comment ont-ils pu compiler, mais avec un être converti en un délégué et un délégué d'une arborescence d'expression? C'est une question difficile - vous devez utiliser une autre caractéristique de méthodes anonymes; le seul qui n'est pas partagée par les expressions lambda. Si vous spécifiez une méthode anonyme, sans spécification d'un paramètre de la liste à tous les il est compatible avec tout type de délégué de retour nulle et sans
out
paramètres. Armés de cette connaissance, nous devrions être en mesure de construire deux surcharges de rendre les expressions sans ambiguïté, mais très différents.Mais catastrophe! Au moins avec C# 3.0, vous ne pouvez pas convertir une expression lambda avec un bloc de corps dans une expression - et vous ne pouvez pas convertir une expression lambda avec une affectation dans le corps (même si elle est utilisée comme valeur de retour). Cela pourrait changer avec C# 4.0 et .NET 4.0, qui permettent plus d'être exprimé dans une arborescence d'expression. Donc, en d'autres termes, avec les exemples MojoFilter qui est arrivé à donner, les deux se presque toujours être converti à la même chose. (Plus de détails dans une minute).
Nous pouvons utiliser le délégué paramètres truc si nous changeons le corps un peu si:
Mais attendez! Nous pouvons distinguer entre les deux, même sans l'aide de l'expression des arbres, si nous sommes assez rusé. L'exemple ci-dessous utilise la résolution de surcharge règles (et le délégué anonyme correspondant truc)...
Ouch. Rappelez-vous les enfants, à chaque fois que vous surcharger une méthode héritée d'une classe de base, un petit chaton se met à pleurer.
ref
paramètres sont OK (l'anonyme méthode sans paramètre de la liste est toujours compatible). Mais avec unout
paramètre qu'il ne peut pas fonctionner, car le corps de la méthode doit nécessairement utiliser tous lesout
paramètres.out
paramètres en veillant à ce que la méthode ne retourne jamais. Je peux le faire avec une boucle infinie, ou de le faire en ayant tous les chemins d'exécution de lever une exception. Mais avec la méthode anonyme, le compilateur m'oblige à spécifier les paramètres si certains d'entre eux sontout
, même si je ne les utilise pas (parce que ma méthode anonyme ne peut pasreturn
). Si votre réponse est correcte maintenant.delegate { return x; }
aller àFunc<int,int > action
- la signature n'est pas la même, ce dernier en a extraint
param type. pouvez-vous nous éclairer ?delegate { ... }
est pas le même quedelegate() { ... }
- ci n'est compatible qu'avec un sans paramètre type de délégué.David B est correcte. Notez qu'il peut y avoir des avantages à l'aide de l'expression des arbres. LINQ to SQL examiner l'expression de l'arbre et de la convertir en SQL.
Vous pouvez également jouer des tours avec lamdas et des arbres d'expression pour effectivement passer les noms des membres de la classe à un cadre dans un refactoring-sûre. Moq en est un exemple.
Dans les deux exemples ci-dessus, il n'y a pas de différence, zéro.
L'expression:
est une expression Lambda avec déclaration de corps, de sorte qu'il ne peut pas être compilé comme une expression de l'arbre. En fait, il n'est même pas compiler, car il a besoin d'un point-virgule après 0:
Il y a une différence
Exemple:
Et je remplace avec lambda:(erreur)
Quelques notions de base ici.
C'est une méthode anonyme
Que les méthodes anonymes n'ont pas de noms que nous avons besoin d'un délégué dans laquelle on peut affecter à la fois de ces méthodes ou des expressions. par exemple,
De même avec l'expression lambda. Généralement, nous avons besoin d'un délégué à les utiliser
Nous pouvons utiliser un délégué func utiliser cette expression.