Delegados
En C#, los delegados son tipos de datos que representan referencias a métodos con una lista de parámetros y un tipo de valor devuelto. Los delegados se utilizan para pasar métodos como argumentos a otros métodos, lo que permite una mayor flexibilidad en la programación.
Para declarar un delegado en C#, se utiliza la palabra clave delegate
. Aquí hay un ejemplo de cómo declarar un delegado que representa un método que toma dos enteros como argumentos y devuelve un entero:
public delegate int Operacion(int a, int b);
En este ejemplo, hemos declarado un delegado llamado Operacion
que representa un método que toma dos enteros como argumentos y devuelve un entero.
Para utilizar un delegado en C#, primero debemos crear una instancia del delegado y asociarla con un método que tenga una signatura compatible. Aquí hay un ejemplo de cómo crear una instancia de un delegado y asociarla con un método:
public static int Suma(int a, int b)
{
return a + b;
}
Operacion operacion = Suma;
int resultado = operacion(2, 3); // resultado = 5
En este ejemplo, hemos creado un método llamado Suma
que toma dos enteros como argumentos y devuelve su suma. Luego, hemos creado una instancia del delegado Operacion
y la hemos asociado con el método Suma
. Finalmente, hemos llamado al delegado con los argumentos 2
y 3
, lo que ha resultado en 5
.
Los delegados también se pueden utilizar para definir métodos de devolución de llamada. Aquí hay un ejemplo de cómo utilizar un delegado para definir un método de devolución de llamada:
public static void ImprimirNumeros(int[] numeros, Operacion operacion)
{
foreach (int numero in numeros)
{
int resultado = operacion(numero, 2);
Console.WriteLine(resultado);
}
}
int[] numeros = { 1, 2, 3, 4, 5 };
Operacion operacion = Suma;
ImprimirNumeros(numeros, operacion);
En este ejemplo, hemos creado un método llamado ImprimirNumeros
que toma una matriz de enteros y un delegado como argumentos. El método itera a través de la matriz y llama al delegado con cada elemento de la matriz y el valor 2
. Luego, imprime el resultado en la consola.
Uso de Delegados:
Ejemplo 1: Delegado Simple
using System;
delegate void MiDelegado(string mensaje);
class Program
{
static void Main()
{
MiDelegado delegado = MostrarMensaje;
delegado("Hola, mundo!");
}
static void MostrarMensaje(string mensaje)
{
Console.WriteLine(mensaje);
}
}
En este ejemplo, MiDelegado
es un delegado que apunta a un método que toma una cadena como parámetro. Luego, se crea una instancia del delegado y se le asigna el método MostrarMensaje
. Finalmente, se invoca el delegado, que ejecuta el método apuntado.
Ejemplo 2: Delegado Multicast
using System;
delegate void MiDelegado(string mensaje);
class Program
{
static void Main()
{
MiDelegado delegado1 = MostrarMensaje;
MiDelegado delegado2 = MostrarOtroMensaje;
MiDelegado delegadoMulticast = delegado1 + delegado2;
delegadoMulticast("Hola, mundo!");
}
static void MostrarMensaje(string mensaje)
{
Console.WriteLine($"Mensaje 1: {mensaje}");
}
static void MostrarOtroMensaje(string mensaje)
{
Console.WriteLine($"Mensaje 2: {mensaje}");
}
}
En este ejemplo, se crean dos delegados (delegado1
y delegado2
) que apuntan a diferentes métodos. Luego, se crea un delegado multicast (delegadoMulticast
) combinando los dos delegados. Cuando se invoca el delegado multicast, ambos métodos apuntados se ejecutan.
Delegados con Métodos Anónimos y Expresiones Lambda:
Ejemplo 3: Delegado con Método Anónimo
using System;
delegate void MiDelegado(string mensaje);
class Program
{
static void Main()
{
MiDelegado delegado = delegate (string mensaje)
{
Console.WriteLine($"Mensaje: {mensaje}");
};
delegado("Hola, mundo!");
}
}
En este ejemplo, se utiliza un método anónimo para inicializar el delegado. En lugar de definir un método separado, se proporciona directamente la implementación del método al delegado.
Ejemplo 4: Delegado con Expresión Lambda
using System;
delegate void MiDelegado(string mensaje);
class Program
{
static void Main()
{
MiDelegado delegado = mensaje => Console.WriteLine($"Mensaje: {mensaje}");
delegado("Hola, mundo!");
}
}
En este ejemplo, se utiliza una expresión lambda para definir el método asociado al delegado. Las expresiones lambda proporcionan una forma más concisa de escribir funciones anónimas.
Los delegados son fundamentales en C# para implementar el concepto de programación orientada a eventos, como se utiliza en la programación de GUI, manejo de eventos, y en otros escenarios donde se requiere la capacidad de notificar y reaccionar a cambios.
https://docs.microsoft.com/es-es/dotnet/csharp/programming-guide/delegates/using-delegates
https://www.tutorialspoint.com/csharp/csharp_delegates.htm
https://steven-giesel.com/blogPost/aa77f7fb-41a7-47d2-8e48-ef9e101cf08e