Lambda expressions son una sintaxis más sencilla para los delegados anónimos y se pueden usar en cualquier lugar donde se pueda usar un delegado anónimo. Sin embargo, lo opuesto no es verdad; Las expresiones lambda se pueden convertir en árboles de expresiones que permiten mucha magia como LINQ to SQL.
El siguiente es un ejemplo de una expresión LINQ to Objects usando delegados anónimos a continuación las expresiones lambda para mostrar cuánto más fácil en el ojo son:
// 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();
expresiones lambda y delegados anónimos tienen una ventaja sobre escribir una función separada : implementan closures que pueden permitirle pass local state to the function without adding parameters a la función o crear objetos de uso único.
Expression trees son una nueva característica muy poderosa de C# 3.0 que permite que una API vea la estructura de una expresión en lugar de solo obtener una referencia a un método que se puede ejecutar. Una API sólo tiene que hacer un parámetro delegado en un parámetro Expression<T>
y el compilador generará un árbol de expresión de una lambda en lugar de un delegado anónimo:
void Example(Predicate<int> aDelegate);
denominado como:
Example(x => x > 5);
se convierte en:
void Example(Expression<Predicate<int>> expressionTree);
Este último se van pasando una representación de la abstract syntax tree que describe la expresión x > 5
. LINQ to SQL se basa en este comportamiento para poder convertir expresiones C# en las expresiones SQL deseadas para filtrar/ordenar/etc. en el lado del servidor. limpiado sintaxis delegado anónimo
Sin cierres puede usar métodos estáticos como devoluciones de llamada, pero aún tiene que definir esos métodos en alguna clase, casi aumentando el alcance de dicho método más allá del uso previsto. –
FWIW, usted * puede * tener cierres con un delegado anónimo, por lo que no necesita estrictamente lambdas para eso.Los lambdas son eminentemente más legibles que los delegados anónimos, sin los cuales el uso de Linq te haría sangrar los ojos. – Benjol