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

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

La página MSDN en métodos anónimos lo explica

En versiones de C # antes de 2.0, la única forma de declarar un delegado era usar métodos con nombre. C # 2.0 introdujo métodos anónimos y en C # 3.0 y versiones posteriores, las expresiones lambda reemplazan a los métodos anónimos como la forma preferida de escribir código en línea. Sin embargo, la información sobre métodos anónimos en este tema también se aplica a las expresiones lambda. Hay un caso en el que un método anónimo proporciona una funcionalidad que no se encuentra en las expresiones lambda. Los métodos anónimos le permiten omitir la lista de parámetros, y esto significa que un método anónimo se puede convertir a delegates con una variedad de firmas. Esto no es posible con expresiones lambda. Para obtener más información específicamente sobre expresiones lambda, vea Expresiones Lambda (Guía de progtwigción C #).

Y con respecto a las expresiones lambda :

Una expresión lambda es una función anónima que puede contener expresiones y sentencias, y se puede usar para crear delegates o tipos de árbol de expresiones. Todas las expresiones lambda utilizan el operador lambda =>, que se lee como “goes to”. El lado izquierdo del operador lambda especifica los parámetros de entrada (si corresponde) y el lado derecho contiene el bloque de expresión o instrucción. La expresión lambda x => 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:

  1. Las expresiones Lambda se pueden convertir a delegates o árboles de expresiones (con algunas restricciones); los métodos anónimos solo pueden convertirse en delegates
  2. Las expresiones Lambda permiten la inferencia de tipo en los parámetros:
  3. Las expresiones lambda permiten que el cuerpo se trunque a solo una expresión (para devolver un valor) o una sola statement (en otros casos) sin llaves.
  4. Las expresiones Lambda permiten acortar la lista de parámetros solo al nombre del parámetro cuando se puede inferir el tipo y cuando solo hay un 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 parecido 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 son convertibles tanto en métodos anónimos como en árboles de expresión, y siguen reglas de inferencia de tipo más complejas que los métodos anónimos.

La gama de diferencias más o menos sutiles está explicada por Eric Lippert (diseñador de lenguaje C #) en su blog:

  • Lambda Expressions vs. Anonymous Methods, Part One
  • Lambda Expressions vs. Anonymous Methods, Part Two
  • Lambda Expressions vs. Anonymous Methods, Parte tres
  • Lambda Expressions vs. Anonymous Methods, Parte Cuatro
  • Lambda Expressions vs. Anonymous Methods, Part Five

Primero, conveniencia: las lambdas son más fáciles de leer y escribir.

En segundo lugar, las expresiones: lambdas se pueden comstackr en un delegado o en un árbol de Expression ( Expression para algún tipo de delegado T, como Func ). Los árboles de expresiones son los más emocionantes, ya que es la clave de LINQ para las tiendas de datos fuera de proceso.

 Func isEven = i => i % 2 == 0; Expression> isEven = i => i % 2 == 0; 

Tenga en cuenta que las expresiones lambda con cuerpos de enunciados solo se pueden comstackr a delegates, no Expression s:

 Action a = () => { Console.WriteLine(obj.ToString()); };