2008-10-16 7 views

Répondre

27

The MSDN page on anonymous methods explains it

Dans les versions de C# 2.0 avant, la seule façon de déclarer un délégué était d'utiliser méthodes nommées. C# 2.0 introduit des méthodes anonymes et en C# 3.0 et plus tard, les expressions lambda remplacent les méthodes anonymes comme méthode préférée pour écrire le code en ligne. Toutefois, les informations sur les méthodes anonymes dans ce sujet s'applique également aux expressions lambda . Il y a un cas dans dont une méthode anonyme fournit fonctionnalité introuvable dans les expressions lambda . Les méthodes anonymes permettent d'omettre la liste des paramètres et cela signifie qu'une méthode anonyme peut être convertie en délégués avec une variété de signatures . Ce n'est pas possible avec des expressions lambda. Pour plus d'informations sur les expressions lambda, voir Lambda Expressions (Guide de programmation C#).

And regarding lambda expressions:

Une expression lambda est une fonction anonyme qui peut contenir des expressions et des déclarations, et peuvent être utilisés pour créer des délégués ou expression types d'arbres. Toutes les expressions lambda utilisent l'opérateur lambda =>, qui est lu comme "va à". Le côté gauche de l'opérateur lambda spécifie les paramètres d'entrée (le cas échéant) et le côté droit contient l'expression ou le bloc d'instructions. L'expression lambda x => x * x est lue "x va à x fois x". Cette expression peut être affectée à un type de délégué comme suit:

10

Tout d'abord, la commodité: les lambdas sont plus faciles à lire et à écrire.

Deuxièmement, les expressions: lambdas peut être compilé pour soit un délégué, ou un arbre d'expression (Expression<T> pour certains T-type délégué, comme Func<int,bool>). Les arborescences d'expression sont d'autant plus excitantes, car c'est la clé de LINQ pour sortir des magasins de données.

Func<int,bool> isEven = i => i % 2 == 0; 
Expression<Func<int,bool>> isEven = i => i % 2 == 0; 

Notez que les expressions lambda avec les organismes d'instruction ne peuvent être compilés aux délégués, non Expression s:

Action a =() => { Console.WriteLine(obj.ToString()); }; 
21
  1. Les méthodes anonymes sont essentiellement des fonctions sans nom, avec la possibilité de créer des fermetures.
  2. Les expressions lambda sont des constructions convertibles en méthodes anonymes et en arborescences d'expression, et suivent des règles plus complexes d'inférence de type que les méthodes anonymes.

La gamme des différences plus ou moins subtiles sont expliquées par Eric Lippert (C# designer de langue) dans son blog:

22
  1. Les expressions Lambda peuvent être converties en délégués ou en arbres d'expression (avec certaines restrictions); Les expressions anonymes permettent l'inférence de type sur les paramètres:
  2. Les expressions lambda permettent de tronquer le corps en une simple expression (pour renvoyer une valeur) ou une seule instruction (dans les autres cas) sans accolades .
  3. Les expressions lambda permettent de raccourcir la liste de paramètres au nom du paramètre lorsque le type peut être déduit et lorsqu'il n'y a qu'un seul paramètre
  4. Les méthodes anonymes permettent d'omettre complètement la liste de paramètres lorsqu'elle n'est pas utilisée dans le corps et il ne mène pas à l'ambiguïté

Le dernier point est le seul avantage des méthodes anonymes sur lambdas, je crois. Il est utile de créer un événement comme champ avec un no-op abonnement si:

public event EventHandler Click = delegate{}; 
+1

Vous devriez être avoir un badge « génial » .. – nawfal

+0

« expressions Lambda permettent la liste des paramètres à être raccourci juste le nom du paramètre quand le type peut être déduit et quand il n'y a qu'un seul paramètre "- Plusieurs paramètres sont bien aussi, non? '(x, y) => {}' – Basic

+1

@Basic: Non, c'est le nom des paramètres * entre parenthèses *. Comparez cela avec 'x => x.Length'. Votre exemple vient du point 2, "Les expressions lambda permettent l'inférence de type sur les paramètres". –

Questions connexes