Wyrażenia lambda są prostszą składnią dla anonimowych delegatów i mogą być używane wszędzie tam, gdzie można użyć anonimowego delegata. Jednak przeciwieństwo nie jest prawdą; wyrażenia lambda można konwertować na drzewa wyrażeń, co pozwala na wiele magii, takich jak LINQ na SQL.
Poniżej znajduje się przykład wyrażenia LINQ do Objects przy użyciu anonimowych delegatów, a następnie wyrażeń lambda, aby pokazać, o ile są one łatwiejsze dla oka:
// 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();
Wyrażenia lambda i anonimowi delegaci mają przewagę nad pisaniem osobnej funkcji: implementują zamknięcia, które pozwalają przekazać stan lokalny do funkcji bez dodawania parametrów do funkcji lub tworzenia obiektów jednorazowego użytku.
Drzewa wyrażeń to nowa, bardzo potężna funkcja C # 3.0, która pozwala interfejsowi API spojrzeć na strukturę wyrażenia zamiast po prostu uzyskać odwołanie do metody, którą można wykonać. Interfejs API musi po prostu przekształcić parametr delegowany w Expression<T>
parametr, a kompilator wygeneruje drzewo wyrażeń z lambda zamiast anonimowego delegata:
void Example(Predicate<int> aDelegate);
nazywany jak:
Example(x => x > 5);
staje się:
void Example(Expression<Predicate<int>> expressionTree);
Ten ostatni przejdzie reprezentację abstrakcyjnego drzewa składni, która opisuje wyrażenie x > 5
. LINQ do SQL polega na tym zachowaniu, aby móc włączyć wyrażenia C # w wyrażenia SQL wymagane do filtrowania / zamawiania / itp. Po stronie serwera.
delegate
jest C #, gorąco polecam przeczytanie tego przed przeczytaniem reszty tej strony: stackoverflow.com/questions/2082615/…