La diferencia entre la expresión c#lambda y la función anónima
La función anónima es una expresión que representa la definición de un método "en línea". Las funciones anónimas no tienen valores ni tipos en sí mismas ni dentro de ellos, pero se pueden convertir en tipos de delegados o árboles de expresión compatibles. La evaluación de una conversión de función anónima depende del tipo de destino de la conversión: si es un tipo de delegado, la conversión se evalúa como un delegado que hace referencia al método definido por la función anónima, si es un tipo de árbol de expresión, la conversión; se evalúa como una estructura de objeto que representa la estructura del método.
Las funciones anónimas tienen dos estilos de sintaxis: expresión lambda (lambda-expression) y expresión de método anónimo (anonymous-method-expression). En casi todos los casos, las expresiones lambda son más concisas y expresivas que las expresiones de métodos anónimos. Pero ahora este último todavía se conserva en el lenguaje C# por motivos de compatibilidad con versiones anteriores.
Expresión lambda:
async opcional (firma de función anónima)=gt (cuerpo de función anónima)
Expresión de método anónimo:
p>async delegado opcional (firma de función anónima explícita) opcional {bloque de código}
La firma de función anónima puede incluir dos tipos, uno es la firma de función anónima implícita y el otro Una es la firma de función anónima explícita:
Firma de función implícita: (p), (p1, p1)
Firma de función explícita: (int p), (int p1, int p2), (ref int p1, out int p2)
El cuerpo de la función anónima puede ser una expresión o un bloque de código.
De lo anterior podemos ver que la forma del parámetro de una expresión Lambda se puede escribir explícita o implícitamente. En una lista de parámetros escrita explícitamente, el tipo de cada parámetro se declara explícitamente; en una lista de parámetros escrita implícitamente, el tipo del parámetro se infiere del contexto en el que se produce la función anónima.
Cuando una expresión Lambda tiene solo un parámetro escrito implícitamente, los paréntesis se pueden omitir de la lista de parámetros, es decir:
(parámetro) =gt
<; p> p>Puede abreviarse como
Parameter=gt; ?Expresión
Algunos ejemplos de funciones anónimas x?=gt;?x?1//Tipo implícito Escribiendo, ¿el cuerpo de la función es una expresión?
x?=gt;?{return?x? ?1;}?//Escribiendo implícitamente, ¿el cuerpo de la función es un bloque de código?
(int?x)?=gt;?x? ?1?// Escritura explícita, ¿el cuerpo de la función es una expresión?
(int?x)?=gt;?{return ?x ?1;}// Escritura explícita, el cuerpo de la función es un bloque de código?
(x?,?y)?=gt;?x?*?y?//Múltiples parámetros ? p>
()?=gt;?Console.WriteLine()?//¿Sin parámetros?
async?(t1?,?t2)?=gt;?await?t1 ?await? ?t2//¿Asincrónico?
delegar?(int?x)?{return?x? ?1;}?//¿Expresión de método de función anónima?
delegar ?{return? 1? ?1;}?//Lista de parámetros omitida
La diferencia entre expresiones Lambda y expresiones de métodos anónimos:
Cuando no hay parámetros, expresiones de métodos anónimos Mientras la expresión permite el La lista de parámetros se omitirá por completo y, por lo tanto, se puede convertir a un tipo delegado con una lista de parámetros de valor arbitrario, la expresión lambda no puede omitir los paréntesis () de la lista de parámetros.
Las expresiones lambda permiten la omisión e inferencia de parámetros de tipo, mientras que las expresiones de métodos anónimos requieren una declaración explícita de los tipos de parámetros.
El cuerpo de una expresión Lambda puede ser una expresión o un bloque de código, mientras que el cuerpo de una expresión de método anónimo debe ser un bloque de código.
Solo las expresiones Lambda son compatibles con los tipos de árboles de expresión.