Respuesta corta: no.
Respuesta más larga que puede no ser relevante:
- Si asigna la lambda a un tipo de delegado (como
Func
oAction
), obtendrá un delegado anónimo.
- Si asigna la lambda a un tipo de expresión, obtendrá un árbol de expresión en lugar de un delegado anónimo. El árbol de expresión se puede compilar a un delegado anónimo.
Editar: Aquí hay algunos enlaces para Expresiones.
- System.Linq.Expression.Expression (TDelegate) (comience aquí).
- Linq en memoria con delegados (como System.Func) usa System.Linq.Enumerable . Linq to SQL (y cualquier otra cosa) con expresiones usa System.Linq.Queryable . Echa un vistazo a los parámetros de esos métodos.
- Una explicación de ScottGu . En pocas palabras, Linq en memoria producirá algunos métodos anónimos para resolver su consulta. Linq to SQL producirá un árbol de expresión que representa la consulta y luego traducirá ese árbol a T-SQL. Linq to Entities producirá un árbol de expresión que representa la consulta y luego traducirá ese árbol al SQL apropiado de la plataforma.
Me gusta la respuesta de Amy, pero pensé que sería pedante. La pregunta dice: "Una vez que se compila", lo que sugiere que ambas expresiones se han compilado. ¿Cómo podrían ambos compilar, pero con uno convertido en un delegado y otro en un árbol de expresión? Es complicado: debe usar otra característica de los métodos anónimos; el único que no es compartido por las expresiones lambda. Si especifica un método anónimo sin especificar una lista de parámetros en absoluto de que es compatible con cualquier tipo de delegado de regresar nula y sin ningún
out
parámetros. Armados con este conocimiento, deberíamos poder construir dos sobrecargas para que las expresiones sean completamente inequívocas pero muy diferentes.¡Pero ocurre un desastre! Al menos con C # 3.0, no puede convertir una expresión lambda con un cuerpo de bloque en una expresión, ni puede convertir una expresión lambda con una asignación en el cuerpo (incluso si se usa como valor de retorno). Esto puede cambiar con C # 4.0 y .NET 4.0, lo que permite que se exprese más en un árbol de expresión. En otras palabras, con los ejemplos que MojoFilter dio, los dos casi siempre se convertirán en lo mismo. (Más detalles en un minuto).
Sin embargo, podemos usar el truco de los parámetros de delegado si cambiamos un poco los cuerpos:
¡Pero espera! Podemos diferenciar entre los dos incluso sin usar árboles de expresión, si somos lo suficientemente astutos. El siguiente ejemplo utiliza las reglas de resolución de sobrecarga (y el truco de coincidencia de delegado anónimo) ...
Ay. Recuerde niños, cada vez que sobrecarga un método heredado de una clase base, un gatito comienza a llorar.
fuente
delegate { ... }
es lo mismo quedelegate() { ... }
: este último solo es compatible con un tipo de delegado sin parámetros.En los dos ejemplos anteriores no hay diferencia, cero.
La expresion:
es una expresión Lambda con cuerpo de declaración, por lo que no se puede compilar como un árbol de expresión De hecho, ni siquiera se compila porque necesita un punto y coma después de 0:
fuente
Amy B tiene razón. Tenga en cuenta que puede haber ventajas al usar árboles de expresión. LINQ to SQL examinará el árbol de expresión y lo convertirá a SQL.
También puede jugar trucos con lamdas y árboles de expresión para pasar efectivamente los nombres de los miembros de la clase a un marco de una manera segura de refactorización. Moq es un ejemplo de esto.
fuente
Hay una diferencia
Ejemplo:
Y lo reemplazo con lambda: (error)
fuente
Algunos conceptos básicos aquí.
Este es un método anónimo.
Como los métodos anónimos no tienen nombres, necesitamos un delegado en el que podamos asignar ambos métodos o expresiones. p.ej
Lo mismo con la expresión lambda. Por lo general, necesitamos un delegado para usarlos
Podemos usar un delegado func para usar esta expresión.
fuente