Expressions lambda constituent une syntaxe plus simple pour les délégués anonymes et peuvent être utilisés partout où un délégué anonyme peut être utilisé. Cependant, l'inverse n'est pas vrai ; les expressions lambda peuvent être converties en arbres d'expression, ce qui permet de réaliser une grande partie de la magie de LINQ to SQL.
Voici un exemple de LINQ to Objects Nous avons utilisé des délégués anonymes, puis des expressions lambda pour montrer à quel point elles sont plus faciles à comprendre :
// anonymous delegate
var evens = Enumerable
.Range(1, 100)
.Where(delegate(int x) { return (x % 2) == 0; })
.ToList();
// lambda expression
var evens = Enumerable
.Range(1, 100)
.Where(x => (x % 2) == 0)
.ToList();
Les expressions lambda et les délégués anonymes présentent un avantage par rapport à l'écriture d'une fonction distincte : ils mettent en œuvre la fonction fermetures qui peut vous permettre de transmettre l'état local à la fonction sans ajouter de paramètres à la fonction ou la création d'objets à usage unique.
Arbres d'expression sont une nouvelle fonctionnalité très puissante de C# 3.0 qui permet à une API d'examiner la structure d'une expression au lieu d'obtenir simplement une référence à une méthode qui peut être exécutée. Une API n'a qu'à transformer un paramètre délégué en un paramètre Expression<T>
et le compilateur générera un arbre d'expression à partir d'une lambda au lieu d'un délégué anonyme :
void Example(Predicate<int> aDelegate);
appelé comme :
Example(x => x > 5);
devient :
void Example(Expression<Predicate<int>> expressionTree);
Ce dernier se verra transmettre une représentation de la arbre syntaxique abstrait qui décrit l'expression x > 5
. LINQ to SQL s'appuie sur ce comportement pour transformer les expressions C# en expressions SQL souhaitées pour le filtrage, l'ordonnancement, etc. du côté du serveur.
5 votes
Pour ceux d'entre vous qui arrivent sur cette page et qui ne savent pas ce qu'est un
delegate
est en C#, je vous conseille vivement de lire ce document. b lire le reste de cette page : stackoverflow.com/questions/2082615/