2008-10-16 55 views

Respuesta

27

The MSDN page on anonymous methods explains it

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

And regarding lambda expressions:

Una expresión lambda es una función anónima que puede contener expresiones y declaraciones, y se puede utilizar para crear delegados o tipos de árboles de expresión. Todas las expresiones lambda utilizan el operador lambda =>, que se lee como "va a". 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:

10

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

En segundo lugar, las expresiones: lambdas puede ser compilado para ya sea un delegado, o un árbol de expresión (Expression<T> por algún tipo de delegado-T, tales como Func<int,bool>). 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<int,bool> isEven = i => i % 2 == 0; 
Expression<Func<int,bool>> isEven = i => i % 2 == 0; 

Tenga en cuenta que las expresiones lambda con los cuerpos de los estados sólo pueden ser compilados a los delegados, no Expression s: métodos

Action a =() => { Console.WriteLine(obj.ToString()); }; 
21
  1. anónimos son básicamente las funciones sin un nombre, con la capacidad de crear cierres.
  2. expresiones lambda son construcciones que son convertibles en ambos métodos anónimos y los árboles de expresión, y seguir las reglas más complejas de la inferencia de tipos de métodos anónimos.

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

22
  1. Las expresiones Lambda se pueden convertir a delegados o árboles de expresiones (con algunas restricciones); métodos anónimos sólo pueden ser convertidos a los delegados
  2. expresiones lambda permiten la inferencia de tipos de parámetros:
  3. expresiones lambda permiten que el cuerpo se trunca a sólo una expresión (para devolver un valor) o declaración individual (en otros casos) sin aparatos .
  4. Las expresiones lambda permiten abreviar la lista de parámetros solo cuando se puede inferir el tipo y cuando hay un solo parámetro
  5. Los métodos anónimos permiten omitir por completo la lista de parámetros cuando no se utiliza dentro del cuerpo y no da lugar a la ambigüedad

el último punto es el único beneficio de los métodos anónimos más de lambdas, creo. Es útil para crear un evento de campo como con una suscripción no-op sin embargo:

public event EventHandler Click = delegate{}; 
+1

usted debe tener una tarjeta de "impresionante" .. – nawfal

+0

"Las expresiones lambda permiten la lista de parámetros que se acortó a sólo el nombre del parámetro cuando se puede inferir el tipo y cuando solo hay un solo parámetro "- Varios parámetros también están bien, ¿no? '(x, y) => {}' – Basic

+1

@Basic: No, esos son los nombres de los parámetros * entre paréntesis *. Compara eso con 'x => x.Length'. Su ejemplo es del punto 2, "Las expresiones Lambda permiten la inferencia de tipo en los parámetros". –

Cuestiones relacionadas