2012-09-04 17 views
10

al profundizar en las características más avanzadas de C#, me encontré con algún código, que no sabía exactamente la diferencia de. Es sobre estas dos líneas:Diferencia entre Func <> con delegado y la expresión lambda

Func<string, int> giveLength = (text => text.Length); 

y

Func<string, int> giveLength = delegate(string text) { return text.Length; }; 

Esto se puede utilizar de la misma manera:

Console.WriteLine(giveLength("A random string.")); 

Así que, básicamente .. ¿Cuál es la diferencia de estas dos líneas? ¿Y estas líneas compilan al mismo CIL?

Respuesta

16

Son lo mismo, básicamente. Ambos son funciones anónimas en la terminología de especificación C#.

Las expresiones Lambda son generalmente más concisas, y también se pueden convertir a expression trees, que son cruciales para LINQ fuera de proceso.

Los métodos anónimos le permiten soltar la lista de parámetros si no le importa. Por ejemplo:

EventHandler handler = delegate { 
    Console.WriteLine("Sender and args don't matter"); 
}; 

Dado que muy pocas veces se requiere a este último punto, los métodos anónimos están convirtiendo en una especie en peligro de extinción en moderna C#. Las expresiones de Lambda son mucho más comunes.

+0

Gracias Jon. Por cierto, recientemente comencé a leer su libro electrónico 'C# en profundidad'. ¡Muy útil! –

+3

@memetolsen: La desventaja es que si lees suficientes de mis respuestas aquí, habrás leído la mayor parte del contenido del libro;) –

+2

Creo que 1/3 de mis votos al alza están en tus respuestas. Pero aún así, preferiría leer el libro en mi tiempo libre en lugar de leer 22,284 respuestas :) –

6

Así que básicamente ... ¿Cuál es la diferencia de estas dos líneas? ¿Y estas líneas compilan al mismo CIL?

Hay dos formas diferentes de escribir lo mismo. La sintaxis lambda es más nueva y más concisa, pero hacen lo mismo (en este caso).

Tenga en cuenta que lambdas (sintaxis =>) también se puede utilizar para formar Expression Lambdas, donde se crea un Expression Tree en lugar de un delegado. Esto es bueno ya que puede usar la misma sintaxis ya sea que esté utilizando LINQ to Objects (que se basa en delegados como Func<T, TResult>) o LINQ to Entities (que usa IQueryable<T> y árboles de expresiones).

+0

Gracias por su respuesta! –

Cuestiones relacionadas