2009-04-17 15 views
10

double:delegate keyword vs. lambda notationdifférence entre les expressions lambda et les méthodes anonymes - C#

Je comprends les méthodes anonymes peuvent être utilisées pour définir des délégués et écrire des fonctions inline. L'utilisation des expressions Lambda est-elle différente de celle-ci?

Je suppose que je suis un peu confus sur quand utiliser quoi.

Éditer: Aussi, semble que pour utiliser anonyme ou lambdas, il doit y avoir une méthode d'extension pour le type?

Répondre

4

Pas vraiment non. Ils sont essentiellement la même fonctionnalité avec différentes constructions de syntaxe. Le changement général semble être loin de la syntaxe de la méthode anonyme C# 2.0 vers la syntaxe de style lambda à la fois pour les expressions anonymes et les fonctions.

15

Une expression lambda est simplement une syntaxe de raccourci pour une méthode anonyme. Les méthodes anonymes ressemblent à ceci:

delegate(params) {method body} 

L'expression lambda équivalent ressemblerait à ceci:

params => method body 

En bref, toutes les expressions lambda sont des méthodes anonymes, mais il est possible d'avoir une méthode anonyme qui est pas écrit en syntaxe lambda (comme le premier exemple ci-dessus). J'espère que c'est utile!

+0

+1, mais ne sont pas des expressions lambda réinventant simplement la roue (plutôt mal, car je pensais que les méthodes anonymes avaient plus de sens). –

+0

donc l'expression de lambada ne peut PAS avoir de valeur de retour? alors que la méthode anonyme peut? –

+1

SnOrfus: oui, ils font la même chose donc vous avez raison, c'est juste une question de préférence syntaxique.Sasha: les méthodes lambda et anonymes peuvent avoir des valeurs de retour. –

6

expressions lambda peuvent être convertis en arbres d'expression, alors que les délégués anonymes ne peuvent pas.

5

Seule l'expression lambda sans corps de méthode peut être converti en arbre d'expression

Après constructions compilons:

  Func<int> exp1 =() => 1; 
      Func<int> exp2 =() => { return 1; }; 
      Func<int> exp3 = delegate { return 1; }; 
      Expression<Func<int>> exp4 =() => 1; 

Et ci-dessous ne pas

Expression<Func<int>> exp5 = delegate { return 1; }; //no anonymous delegates 
Expression<Func<int>> exp6 =() => { return 1; }; //or lambdas with block body 

Donc, il est différence même sur un niveau pas très avancé (que Jon Sk eet souligne ici sick difference example)

Une autre différence est que vous pouvez créer des délégués anonymes sans liste de paramètres si vous ne prévoyez pas de les utiliser dans le corps de la méthode, avec lambda vous devez toujours fournir des paramètres.

deux lignes suivantes montrent la différence

Func<int, int, int, int, int> anonymous = delegate { return 1; }; 
Func<int, int, int, int, int> lambda = (param1, param2, param3, param4) => 1; 

Vous faites essentiellement la même chose, mais délégué anonyme semble bien mieux ici.

Questions connexes