Quelle est la différence entre les méthodes anonymes de C # 2.0 et les expressions lambda de C # 3.0.?
Réponses
Trop de publicités?La page MSDN sur les méthodes anonymes explique
Dans les versions de C# avant 2.0, la seule façon de déclarer un délégué à utiliser nommé méthodes. C# 2.0 a introduit les méthodes anonymes et en C# 3.0 et plus tard, les expressions lambda remplacent les méthodes anonymes comme le moyen privilégié pour écrire le code en ligne. Cependant, l' informations sur les méthodes anonymes en cette rubrique s'applique également à lambda les expressions. Il existe un cas qui fournit une méthode anonyme la fonctionnalité n'est pas trouvé dans lambda les expressions. Les méthodes anonymes permettre vous omettez le paramètre de la liste, et cela signifie qu'une méthode anonyme peut être converti pour les délégués de variété de signatures. Ce n'est pas possible avec les expressions lambda. Pour plus d'informations sur les expressions lambda, voir Lambda Les Expressions (Guide De Programmation C#).
Et concernant les expressions lambda:
Une expression lambda est une fonction anonyme qui peuvent contenir des expressions et instructions, et peut être utilisé pour créer des délégués ou de l'expression des types d'arbres. Toutes les expressions lambda utiliser le lambda de l'opérateur =>, qui est lu comme "va". Le côté gauche de la lambda opérateur spécifie les paramètres d'entrée (le cas échéant) et le côté droit est titulaire de l'instruction ou de l'expression de bloc. L'expression lambda x => x * x est lu "x tend vers x x fois." Cette expression peut être attribuée à un délégué de type comme suit:
- Les expressions Lambda peut être converti des délégués ou des arbres d'expression (avec certaines restrictions); les méthodes anonymes ne peuvent être convertis pour les délégués
- Les expressions Lambda permettent de type inférence sur les paramètres:
- Les expressions Lambda de permettre au corps d'être tronqué à une expression (pour renvoyer une valeur) ou d'un état unique (dans les autres cas) sans bretelles.
- Les expressions Lambda permettre la liste des paramètres à être réduit à simplement le nom du paramètre lorsque le type peut être déduit et quand il n'y a qu'un seul paramètre
- Les méthodes anonymes permettent de la liste des paramètres à être omise lorsqu'elle n'est pas utilisée dans le corps et il ne conduit pas à l'ambiguïté
Le dernier point est le seul avantage des méthodes anonymes sur les lambdas, je crois. Il est utile de créer un champ comme événement avec un no-op abonnement si:
public event EventHandler Click = delegate{};
- Les méthodes anonymes sont fondamentalement des fonctions sans nom, avec la possibilité de créer des fermetures.
- Les expressions Lambda sont des constructions qui sont convertibles à la fois les méthodes anonymes et des arbres d'expression, et de suivre des règles plus complexes de l'inférence de type de méthodes anonymes.
La plage de plus ou moins subtiles différences sont expliquées par Eric Lippert (langage C# designer) dans son blog:
- Les Expressions Lambda contre les Méthodes Anonymes, première Partie
- Les Expressions Lambda contre les Méthodes Anonymes, Partie Deux
- Les Expressions Lambda contre les Méthodes Anonymes, Partie à Trois
- Les Expressions Lambda contre les Méthodes Anonymes, quatrième Partie
- Les Expressions Lambda contre les Méthodes Anonymes, cinquième Partie
Tout d'abord, la commodité: les lambdas sont plus faciles à lire et à écrire.
Deuxièmement, les expressions lambdas peuvent être compilés pour soit un délégué, ou une expression de l'arbre (Expression<T>
pour certains délégué de type T, comme Func<int,bool>
). Des arbres d'Expression sont le plus excitant, comme c'est la clé pour LINQ to out-of-process 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 déclaration organes ne peuvent être compilés pour les délégués Expression
s:
Action a = () => { Console.WriteLine(obj.ToString()); };