¿Cuál es la diferencia entre los métodos anónimos (C # 2.0) y las expresiones lambda (C # 3.0)? [duplicar]

StackOverflow https://stackoverflow.com/questions/208381

  •  03-07-2019
  •  | 
  •  

Pregunta

    

Esta pregunta ya tiene una respuesta aquí:

         

¿Cuál es la diferencia entre métodos anónimos de C # 2.0 y expresiones lambda de C # 3.0.?

¿Fue útil?

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

  1. 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
  2. Las expresiones lambda permiten la inferencia de tipos en los parámetros:
  3. 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.
  4. 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
  5. 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{};
  1. Los métodos anónimos son básicamente funciones sin nombre, con la capacidad de crear cierres.
  2. 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()); };
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top