¿Cuál es la diferencia entre los métodos anónimos (C # 2.0) y las expresiones lambda (C # 3.0)? [duplicar]
-
03-07-2019 - |
Pregunta
Esta pregunta ya tiene una respuesta aquí:
- delegar palabra clave versus notación lambda 6 respuestas
¿Cuál es la diferencia entre métodos anónimos de C # 2.0 y expresiones lambda de C # 3.0.?
Solución
La página de MSDN sobre métodos anónimos lo explica
En versiones de C # anteriores a 2.0, el único manera de declarar un delegado era usar métodos con nombre. C # 2.0 introducido métodos anónimos y en C # 3.0 y más tarde, las expresiones lambda reemplazan métodos anónimos como la forma preferida para escribir código en línea. sin embargo, el información sobre métodos anónimos en este tema también se aplica a lambda expresiones Hay un caso en que proporciona un método anónimo funcionalidad no encontrada en lambda expresiones Los métodos anónimos permiten omitir la lista de parámetros, y Esto significa que un método anónimo se puede convertir a delegados con un variedad de firmas Esto no es posible con expresiones lambda. por más información específicamente sobre expresiones lambda, ver Lambda Expresiones (Guía de programación de C #).
Y con respecto a las expresiones lambda :
Una expresión lambda es una función anónima que puede contener expresiones y declaraciones, y puede usarse para crear delegados o tipos de árbol de expresión. Todas las expresiones lambda usan el operador lambda = & Gt ;, que se lee como & Quot; va a & Quot ;. El lado izquierdo del operador lambda especifica los parámetros de entrada (si los hay) y el lado derecho contiene la expresión o el bloque de instrucción. La expresión lambda x = & Gt; x * x se lee " x va a x veces x. " Esta expresión se puede asignar a un tipo de delegado de la siguiente manera:
Otros consejos
- Las expresiones lambda se pueden convertir en delegados o árboles de expresiones (con algunas restricciones); los métodos anónimos solo se pueden convertir en delegados
- Las expresiones lambda permiten la inferencia de tipos en los parámetros:
- Las expresiones lambda permiten que el cuerpo se trunca en solo una expresión (para devolver un valor) o una sola declaración (en otros casos) sin llaves.
- Las expresiones lambda permiten que la lista de parámetros se acorte solo al nombre del parámetro cuando se puede inferir el tipo y cuando solo hay un único parámetro
- Los métodos anónimos permiten que la lista de parámetros se omita por completo cuando no se usa dentro del cuerpo y no genera ambigüedad
El último punto es el único beneficio de los métodos anónimos sobre lambdas, creo. Sin embargo, es útil crear un evento similar a un campo con una suscripción no operativa:
public event EventHandler Click = delegate{};
- Los métodos anónimos son básicamente funciones sin nombre, con la capacidad de crear cierres.
- Las expresiones lambda son construcciones que se pueden convertir tanto en métodos anónimos como en árboles de expresiones, y siguen reglas más complejas de inferencia de tipos que los métodos anónimos.
Eric Lippert (diseñador de lenguaje C #) explica en su blog el rango de diferencias más o menos sutiles:
Primero, conveniencia: las lambdas son más fáciles de leer y escribir.
Segundo, expresiones: las lambdas pueden compilarse en ya sea un delegado, o un árbol de expresiones (Expression<T>
para algún tipo de delegado T, como Func<int,bool>
) Los árboles de expresión son los más emocionantes, ya que es la clave de LINQ para los almacenes de datos fuera de proceso.
Func<int,bool> isEven = i => i % 2 == 0;
Expression<Func<int,bool>> isEven = i => i % 2 == 0;
Tenga en cuenta que las expresiones lambda con cuerpos de declaración solo pueden compilarse para delegados, no Expression
s:
Action a = () => { Console.WriteLine(obj.ToString()); };