2009-04-17 21 views

Respuesta

4

No realmente no. Son esencialmente la misma característica con diferentes construcciones de sintaxis. El cambio general parece estar lejos de la sintaxis del método anónimo C# 2.0 hacia la sintaxis de estilo lambda para expresiones y funciones anónimas.

15

Una expresión lambda es simplemente la sintaxis de acceso directo para un método anónimo. métodos anónimos aspecto:

delegate(params) {method body} 

La expresión lambda equivalente sería el siguiente aspecto:

params => method body 

En resumen, todas las expresiones lambda son los métodos anónimos, pero es posible tener un método anónimo que es no escrito en sintaxis lambda (como el primer ejemplo anterior). Espero que esto sea útil!

+0

+1, pero no son expresiones lambda simplemente reinventando la rueda (bastante mal, ya que creo que los métodos anónimos tienen más sentido). –

+0

por lo que la expresión lambada NO puede tener valores devueltos? mientras que el método anónimo puede? –

+1

SnOrfus: sí, hacen lo mismo, así que tienes razón, es solo una cuestión de preferencia de sintaxis.Sasha: tanto las lambdas como los métodos anónimos pueden tener valores de retorno. –

6

expresiones lambda se pueden convertir a los árboles de expresión, mientras que los delegados anónimos no pueden.

5

Sólo expresión lambda sin cuerpo del método se puede convertir al árbol de expresión

siguientes construcciones do de compilación:

  Func<int> exp1 =() => 1; 
      Func<int> exp2 =() => { return 1; }; 
      Func<int> exp3 = delegate { return 1; }; 
      Expression<Func<int>> exp4 =() => 1; 

Y después de hacer no

Expression<Func<int>> exp5 = delegate { return 1; }; //no anonymous delegates 
Expression<Func<int>> exp6 =() => { return 1; }; //or lambdas with block body 

por lo que hay diferencia incluso en un nivel no muy avanzado (que Jon Sk eet señala aquí sick difference example)

Otra diferencia es que puede crear delegados anónimos sin lista de parámetros si no planea usarlos dentro del cuerpo del método, con lambda siempre debe proporcionar los parámetros.

dos líneas siguientes demuestran la diferencia

Func<int, int, int, int, int> anonymous = delegate { return 1; }; 
Func<int, int, int, int, int> lambda = (param1, param2, param3, param4) => 1; 

Usted hace esencialmente lo mismo, pero en el anonimato delegado claramente se ve mejor aquí.

Cuestiones relacionadas