Expressões lambda são uma sintaxe mais simples para delegados anônimos e podem ser usadas em qualquer lugar em que um delegado anônimo possa ser usado. No entanto, o oposto não é verdadeiro; As expressões lambda podem ser convertidas em árvores de expressão, o que permite muita mágica, como LINQ to SQL.
A seguir, é apresentado um exemplo de expressão de LINQ to Objects usando delegados anônimos e expressões lambda para mostrar como são mais fáceis para os olhos:
// 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();
Expressões lambda e delegados anônimos têm uma vantagem em escrever uma função separada: eles implementam fechamentos que permitem passar o estado local para a função sem adicionar parâmetros à função ou criar objetos de uso único.
As árvores de expressão são um novo recurso muito poderoso do C # 3.0 que permite que uma API observe a estrutura de uma expressão em vez de apenas obter uma referência a um método que pode ser executado. Uma API apenas precisa transformar um parâmetro delegado em um Expression<T>
parâmetro e o compilador gerará uma árvore de expressão de um lambda em vez de um delegado anônimo:
void Example(Predicate<int> aDelegate);
chamado como:
Example(x => x > 5);
torna-se:
void Example(Expression<Predicate<int>> expressionTree);
Este último receberá uma representação da árvore de sintaxe abstrata que descreve a expressão x > 5
. O LINQ to SQL depende desse comportamento para poder transformar expressões C # nas expressões SQL desejadas para filtragem / pedido / etc. no lado do servidor.
delegate
é um C #, sugiro que você leia isso antes de ler o restante desta página: stackoverflow.com/questions/2082615/…