Delegados y Eventos en C#

Los delegados en C# son tipos seguros que representan referencias a métodos con una firma específica. Permiten pasar métodos como parámetros o almacenarlos como variables. Los eventos, por su parte, se basan en delegados y permiten implementar el patrón de suscripción y notificación, facilitando la comunicación entre componentes desacoplados.

Definir y usar un delegado

Un delegado se define especificando la firma que pueden tener los métodos asignados.

public delegate void SaludoDelegate(string nombre);

public void Saludar(string nombre) {
    Console.WriteLine($"Hola, {nombre}!");
}

// Uso
SaludoDelegate delegado = Saludar;
delegado("Alice");
    

Aquí el delegado SaludoDelegate puede apuntar a cualquier método que reciba un string y devuelva void.

Eventos basados en delegados

Los eventos permiten que una clase notifique a otras cuando ocurre algo. Internamente usan delegados para gestionar la lista de suscriptores.

public class Notificador {
    public event SaludoDelegate AlSaludar;

    public void EjecutarSaludo(string nombre) {
        AlSaludar?.Invoke(nombre);
    }
}

// Suscripción
var notificador = new Notificador();
notificador.AlSaludar += Saludar;
notificador.EjecutarSaludo("Bob");
    

Aquí varias funciones pueden suscribirse al evento AlSaludar.

Buenas Prácticas

Usa delegados para permitir flexibilidad al pasar métodos. Prefiere eventos para notificación y desacoplamiento entre componentes. Usa EventHandler o EventHandler<T> para mantener consistencia en eventos públicos. Desuscribe manejadores para evitar fugas de memoria en aplicaciones largas.

Ver también

Documentación oficial de Microsoft

Ver más en Microsoft Docs