Lorsque vous devez créer une instance d'un délégué qui a un seul paramètre, les expressions lambda permettent de créer ce délégué « en ligne » d'une manière très concise. Par exemple, voici le code pour trouver une personne en particulier dans une liste, par leur nom:
List<Person> list = new List<Person>();
// [..] Populate list here
Person jon = list.Find(p => p.Name == "Jon");
En C# 2.0, vous pouvez utiliser une méthode anonyme qui était un peu plus verbeux, mais pas trop mauvais:
List<Person> list = new List<Person>();
// [..] Populate list here
Person jon = list.Find(delegate(Person p) { return p.Name == "Jon"; });
En C# 1.0, vous devez créer une méthode supplémentaire complète. En outre, si vous vouliez paramétriser, vous auriez à créer un autre type, alors que les méthodes anonymes et les expressions lambda capturent leur environnement d'exécution (variables locales, etc.) afin qu'ils agissent comme des fermetures:
public Person FindByName(List<Person> list, String name)
{
return list.Find(p => p.Name == name); // The "name" variable is captured
}
Il y a plus à ce sujet dans my article about closures. Bien que le transfert de délégués dans les méthodes ne soit pas très répandu dans C# 2.0 et .NET 2.0, c'est une grande partie de la base de LINQ - vous avez donc tendance à l'utiliser beaucoup en C# 3.0 avec .NET 3.5.
C'est ce que je pensais. Où est-il utile d'appeler directement ToString? –
Tout seul, il ne le fait pas. Cela dépend du contexte dans lequel vous l'utilisez. –
David: Supposons que vous souhaitiez transformer une liste d'entiers en une liste de chaînes. Vous pouvez écrire une routine de transformation généralisée, mais il faut un délégué à appliquer à * chaque * valeur dans la liste - et les expressions lambda facilitent la spécification de ce délégué. –