Los delegados en C# son tipos de datos que actúan como punteros a métodos, permitiendo asignar funciones a variables y pasarlas como parámetros. Son fundamentales para eventos, callbacks y programación funcional en .NET.
Un delegado se define como un tipo que encapsula una referencia a un método con una firma específica. Esto permite invocar métodos de manera flexible sin conocer su implementación exacta.
1. Definir el delegado: Se declara con delegate
.
2. Asignar un método: Se asocia a una función con la misma firma.
3. Invocar el método: Se ejecuta llamando al delegado.
using System;
public class Program {
// Definir el delegado
public delegate void SaludoDelegate(string nombre);
// Método que coincide con la firma del delegado
public static void DecirHola(string nombre) {
Console.WriteLine($"Hola, {nombre}!");
}
public static void Main() {
// Asignar método al delegado
SaludoDelegate delegado = new SaludoDelegate(DecirHola);
// Invocar el delegado
delegado("Carlos");
}
}
Salida:
Hola, Carlos!
Func
, Action
, Predicate
)
Para simplificar código, C# proporciona delegados genéricos:
Action<T>
: Representa métodos que no devuelven valor (void
).
Func<T, TResult>
: Representa métodos que devuelven un valor.
Predicate<T>
: Representa métodos que devuelven bool
.
Ejemplo con Func<int, int>
:
Func<int, int> cuadrado = x => x * x;
Console.WriteLine(cuadrado(5)); // 25
Un delegado puede apuntar a varios métodos.
public static void Adios(string nombre) {
Console.WriteLine($"Adiós, {nombre}!");
}
SaludoDelegate multiDelegado = DecirHola;
multiDelegado += Adios;
multiDelegado("Ana");
Salida:
Hola, Ana!
Adiós, Ana!
Son clave en el manejo de eventos con event
:
public delegate void EventoHandler(string mensaje);
public class Notificador {
public event EventoHandler Evento;
public void DispararEvento() {
Evento?.Invoke("¡Evento activado!");
}
}
Jorge García
Fullstack developer