Un delegate es un tipo que representa referencias a métodos con una lista de parámetros determinada y un tipo de valor devuelto. Es la versión de .NET de los punteros a función de C++ pero con seguridad de tipos (type-safe), es decir, se comprueban los tipos de retorno y de los parámetros del mismo. La clase de delegado no sólo contiene una referencia a un método, también puede mantener referencias a varios métodos mientras cumplan con la firma definida. Veamos un ejemplo:
using System;
public delegate void MiDelegado(int i);
public class Test
{
public static void Main()
{
MiClase miClase = new MiClase();
// instanciamos un delegado. Observa que el método MiMetodo de la clase
// MiClase cumple con la firma definida en el delegado
MiDelegado delegado = new MiDelegado(miClase.MiMetodo);
delegado(83); // Se hace la llamada al delegado
}
}
public class MiClase
{
public void MiMetodo(int i)
{
Console.WriteLine("El valor pasado como parámetro es: {0}", i);
}
}
Como podemos instanciar delegados? Tenemos diferentes maneras:
- Constructor: MiDelegado delegado = new MiDelegado(miClase.MiMetodo);
- Directamente con asignación: MiDelegado delegado = miClase.MiMetodo;
- Anonymous methods: MiDelegado delegado = delegate(int i) { Console.WriteLine("El valor pasado como parámetro es: {0}", i); };
- Y lambda expressions: MiDelegado delegado = x => { Console.WriteLine("El valor pasado como parámetro es: {0}", x); };
La verdad no entiendo muy bien, la ventaja y desventaja ante clausuras o lambdas. Voy a tener que seguir leyendo.
Dejo link: https://www.tutorialsteacher.com/csharp/csharp-delegates