tipo puede metodos funciones expresiones expresion ejemplos delegados delegado convertir anonimos anonimas c# .net-3.5 delegates lambda anonymous-methods

puede - metodos anonimos c#



¿Hay algún caso en el que se prefiera la sintaxis de delegado sobre la expresión lambda para métodos anónimos? (7)

Las expresiones Lambda son solo "azúcar sintáctico", el compilador generará delegados adecuados para usted. Puedes investigar esto usando el reflector de Lutz Roeder.

Con el advenimiento de nuevas características como expresiones lambda (código en línea), ¿significa que ya no tenemos que usar delegados ni métodos anónimos? En casi todas las muestras que he visto, es para reescribir utilizando la nueva sintaxis.

¿No funcionará ningún lugar donde todavía tengamos que usar delegados y expresiones lambda?


Los Lamda son solo azúcares sintácticos para los delegados, no son solo en línea, puedes hacer lo siguiente:

s.Find(a => { if (a.StartsWith("H")) return a.Equals("HI"); else return !a.Equals("FOO"); });

Y los delegados todavía se utilizan para definir eventos, o cuando tiene muchos argumentos y desea escribir con fuerza el método que se está llamando.


lambda es un atajo para delegado anónimo, pero siempre usará delegados. el delegado especifica la firma de los métodos. puedes hacer esto:

delegate(int i) { Console.WriteLine(i.ToString()) }

puede ser reemplazado por

f => Console.WriteLine(f.ToString())


Sí, hay lugares en los que el uso directo de delegados anónimos y expresiones lambda no funcionará.

Si un método toma un Delegado sin tipo, entonces el compilador no sabe a qué resolver la expresión delegado / lambda anónima y obtendrá un error de compilación.

public static void Invoke(Delegate d) { d.DynamicInvoke(); } static void Main(string[] args) { // fails Invoke(() => Console.WriteLine("Test")); // works Invoke(new Action(() => Console.WriteLine("Test"))); Console.ReadKey(); }

La línea de código que falla obtendrá el error del compilador "No se puede convertir la expresión lambda para escribir ''System.Delegate'' porque no es un tipo de delegado".


El delegado tiene dos significados en C #.

El delegate palabra clave se puede usar para definir un tipo de firma de función. Esto se usa generalmente cuando se define la firma de funciones de orden superior, es decir, funciones que toman otras funciones como argumentos. Este uso de delegado sigue siendo relevante.

La palabra clave delegate también se puede usar para definir una función anónima en línea. En el caso donde la función es solo una expresión, la sintaxis lambda es una alternativa más simple.


La expresión Lambda no es (y no debía ser) una bala de plata que reemplazaría (ocultaría) a los delegados. Es genial con pequeñas cosas locales como:

List<string> names = GetNames(); names.ForEach(Console.WriteLine);

  1. hace que el código sea más legible y, por lo tanto, más simple de entender.
  2. Hace que el código sea más corto, por lo tanto, menos trabajo para nosotros;)

Por otro lado, es muy simple abusar de ellos. Las expresiones lambda largas o complejas tienden a ser:

  1. Difícil de entender para los nuevos desarrolladores
  2. Menos orientado a objetos
  3. Mucho más difícil de leer

Entonces, "¿significa que ya no tenemos que usar delegados ni métodos anónimos?" No, utilice la expresión Lambda donde gane tiempo / legibilidad; de lo contrario, considere usar delegados.


Una ventaja no tan grande para la sintaxis del delegate anterior es que no necesita especificar los parámetros si no los usa en el cuerpo del método. De msdn

Hay un caso en el que un método anónimo proporciona una funcionalidad que no se encuentra en las expresiones lambda. Los métodos anónimos le permiten omitir la lista de parámetros. Esto significa que un método anónimo se puede convertir en delegados con una variedad de firmas. Esto no es posible con expresiones lambda.

Por ejemplo, puedes hacer:

Action<int> a = delegate { }; //takes 1 argument, but not specified on the RHS

Mientras esto falla:

Action<int> a = => { }; //omitted parameter, doesnt compile.

Esta técnica es más útil cuando se escriben controladores de eventos, como:

button.onClicked += delegate { Console.WriteLine("clicked"); };

Esto no es una gran ventaja. Es mejor adoptar la sintaxis más nueva siempre imho.