sirven que para las expresiones ejemplos c# delegates lambda

c# - que - ¿Cuál es el punto de una expresión lambda?



linq lambda c# (7)

Dejemos los árboles de expresión fuera de la ecuación por el momento y simulemos que las lambdas son solo una forma más corta de escribir delegados.

Esto sigue siendo una gran victoria en el ámbito de los lenguajes de tipo estático como C # porque dichos lenguajes requieren que se escriba mucho código para lograr objetivos relativamente simples. ¿Necesita comparar una serie de cadenas por longitud de cadena? Necesitas escribir un método para eso. Y necesitas escribir una clase para poner el método en. Y luego, las buenas prácticas dictan que esta clase debe estar en su propio archivo fuente. En cualquier proyecto que no sea el más pequeño, todo esto se suma. Cuando hablamos de cosas pequeñas, la mayoría de la gente quiere un camino menos detallado hacia la meta y las lambdas son lo más concisas que pueden llegar.

Además, las lambdas pueden crear fácilmente cierres (capturar variables del alcance actual y extender su vida útil). Esto no es mágico (el compilador lo hace creando una clase oculta y realizando otras transformaciones que puede hacer usted mismo), pero es mucho más conveniente que la alternativa manual.

Y luego están los árboles de expresiones: una forma de escribir código y hacer que el compilador transforme este código en una estructura de datos que se pueda analizar, modificar e incluso compilar en tiempo de ejecución. Esta es una característica extremadamente poderosa que abre la puerta a una funcionalidad impresionante (que definitivamente considero que LINQ es). Y lo consigues "gratis".

Después de leer este artículo , no puedo entender por qué se usan las expresiones lambda. Para ser justos, no creo que tenga una comprensión adecuada de lo que son los delegados y los tipos de árbol de expresión, pero no entiendo por qué alguien usaría una expresión lambda en lugar de una función declarada. ¿Puede alguien iluminarme?


Hacen que sea fácil pasar una pieza simple de funcionalidad a otra función. Por ejemplo, es posible que desee realizar una función pequeña y arbitraria en cada elemento de una lista (tal vez quiera cuadrarla, sacar la raíz cuadrada, etc.). En lugar de escribir un nuevo bucle y función para cada una de estas situaciones, puedo escribirlo una vez y aplicar mi funcionalidad arbitraria definida más adelante a cada elemento.


La razón principal por la que usaría un lambda sobre una función declarada es cuando necesita usar una parte de información local en la expresión de delegado. Por ejemplo

void Method(IEnumerable<Student> students, int age) { var filtered = students.Where(s => s.Age == age); ... }

Lambdas permite la fácil captura del estado local para ser utilizado dentro de la expresión delegada. Hacer esto manualmente requiere mucho trabajo porque necesita declarar tanto una función como un tipo contenedor para mantener el estado. Por ejemplo aquí está lo anterior sin un lambda

void Method(IEnumerable<Student> students, int age) { var c = new Closure() { Age = age }; var filtered = students.Where(c.WhereDelegate); ... } class Closure { public int age; bool WhereDelegate(Student s) { return s.Age == age; } }

Escribir esto es tedioso y propenso a errores. Las expresiones Lambda automatizan este proceso.


Lambda hace código corto y dulce. Considere los siguientes dos ejemplos:

clase publica estudiante

{ public string Name { get; set; } public float grade { get; set; } public static void failed(List<Student> studentList, isFaild fail) { foreach (Student student in studentList) { if(fail(student)) { Console.WriteLine("Sorry" + " "+student.Name + " "+ "you faild this exam!"); } } }

delegado público bool isFaild (Student myStudent);

class Program { static void Main(string[] args) { List<Student> studentsList = new List<Student>(); studentsList .Add(new Student { ID = 101, Name = "Rita", grade = 99 }); studentsList .Add(new Student { ID = 102, Name = "Mark", grade = 48 }); Student.failed(studentsList, std => std.grade < 60); // with Lamda } }

bool estático privado isFaildMethod (Student myStudent) // sin Lambda

{

si (myStudent.grade <60)

{ return true; } else { return false; } }


Primero: brevedad y localidad :

¿Cuál preferirías escribir, leer y mantener? Esta:

var addresses = customers.Select(customer=>customer.Address);

o:

static private Address GetAddress(Customer customer) { return customer.Address; } ... a thousand lines later ... var addresses = customers.Select(GetAddress);

¿Cuál es el punto de saturar su programa con cientos o miles de funciones de cuatro líneas cuando podría poner el código que necesita donde lo necesita como una expresión corta?

Segundo: las lambdas se cierran sobre los ámbitos locales

¿Qué preferirías leer, escribir y mantener, esto:

var currentCity = GetCurrentCity(); var addresses = customers.Where(c=>c.City == currentCity).Select(c=>c.Address);

o:

static private Address GetAddress(Customer customer) { return customer.Address; } private class CityGetter { public string currentCity; public bool DoesCityMatch(Customer customer) { return customer.City == this.currentCity; } } .... var currentCityGetter = new CityGetter(); currentCityGetter.currentCity = GetCurrentCity(); var addresses = customers.Where(currentCityGetter.DoesCityMatch).Select(GetAddress);

Todo ese código desconcertante está escrito para ti cuando usas un lambda.

Tercero: las comprensiones de consultas se reescriben en lambdas para usted

Cuando escribes:

var addresses = from customer in customers where customer.City == currentCity select customer.Address;

se transforma en la sintaxis lambda para ti. A muchas personas les resulta agradable leer esta sintaxis, pero necesitamos la sintaxis lambda para que realmente funcione.

Cuarto: las lambdas son opcionalmente de tipo inferido

Tenga en cuenta que no tenemos que dar el tipo de "cliente" en la comprensión de consulta anterior, o en las versiones lambda, pero sí tenemos que dar el tipo del parámetro formal al declararlo como un método estático. El compilador es inteligente al inferir el tipo de un parámetro lambda del contexto. Esto hace que su código sea menos redundante y más claro.

Quinto: Lambdas pueden convertirse en arboles de expresión.

Supongamos que desea solicitar a un servidor web "envíeme las direcciones de los clientes que viven en la ciudad actual". ¿Desea (1) retirar un millón de clientes del sitio web y realizar el filtrado en la máquina de su cliente, o (2) enviar al sitio web un objeto que le indique que "la consulta contiene un filtro en la ciudad actual y luego una selección de la dirección "? Deje que el servidor haga el trabajo y le envíe solo el resultado que coincida.

Los árboles de expresión permiten al compilador convertir el lambda en un código que puede transformarse en otro formato de consulta en tiempo de ejecución y enviarse a un servidor para su procesamiento. Los pequeños métodos de ayuda que se ejecutan en el cliente no lo hacen.


Se usan mucho con LINQ, en realidad LINQ sería bastante malo sin él. Puedes hacer cosas como:

Database.Table.Where (t => t.Field == "Hello");


http://msdn.microsoft.com/en-us/magazine/cc163362.aspx

Gran artículo sobre qué son las lambdas y por qué puedes / debes usarlas.

Esencialmente, la expresión lambda proporciona una abreviatura para que el compilador emita métodos y los asigne a los delegados; todo esto es hecho por ti El beneficio que obtiene con una expresión lambda que no obtiene de una combinación de delegado / función es que el compilador realiza una inferencia de tipo automática en los argumentos lambda