Kiedy trzeba utworzyć wystąpienie delegata, który ma jeden parametr, wyrażenia lambda pozwala na tworzenie tego delegata „inline” w bardzo zwięzły sposób. Na przykład, oto kod, aby znaleźć konkretną osobę na liście, o nazwie:
List<Person> list = new List<Person>();
// [..] Populate list here
Person jon = list.Find(p => p.Name == "Jon");
W języku C# 2.0 można użyć anonimowego sposobu, który był trochę bardziej rozwlekłości, ale nie zbyt złe:
List<Person> list = new List<Person>();
// [..] Populate list here
Person jon = list.Find(delegate(Person p) { return p.Name == "Jon"; });
W języku C# 1.0 trzeba utworzyć całą dodatkową metodę. Ponadto, jeśli chciał go parametryzacji, trzeba by utworzyć inny typ, natomiast anonimowe metody i wyrażenia lambda uchwycić ich środowiska wykonującego (zmienne lokalne itp), więc działają one jak zamknięć:
public Person FindByName(List<Person> list, String name)
{
return list.Find(p => p.Name == name); // The "name" variable is captured
}
Jest więcej o tym w my article about closures.
Podczas przekazywania uczestników do metod nie jest strasznie często w C# 2.0 i .NET 2.0, jest to duża część podstaw LINQ - więc często używasz go w C# 3.0 z .NET 3.5.
Tak właśnie myślałem. Gdzie to pomaga przez wywoływanie ToString bezpośrednio? –
Wszystko samo w sobie nie działa. To zależy od kontekstu, w którym go używasz. –
David: Załóżmy, że chcesz przekształcić listę liczb całkowitych na listę ciągów. Możesz napisać uogólnioną procedurę transformacji, ale potrzebuje delegata, aby zastosować do * każdej * wartości na liście - a wyrażenia lambda ułatwiają określenie tego delegata. –