Sobes.tech
Junior

¿Qué son los eventos en C#?

sobes.tech AI

Respuesta de la IA

Los eventos en C# son un mecanismo basado en el patrón "observador" (Observer Pattern), que permite a un objeto (el emisor) notificar a otros objetos (los suscriptores) sobre la ocurrencia de una acción o cambio de estado.

Componentes principales:

  • Emisor (Publisher): Clase que declara un evento.
  • Evento (Event): Declaración de un evento usando la palabra clave event. Define la firma del método que los manejadores utilizarán.
  • Delegado (Delegate): Tipo que define la firma de los métodos que pueden suscribirse a un evento. Frecuentemente se usa el delegado predefinido EventHandler o EventHandler<TEventArgs>.
  • Suscriptor (Subscriber): Clase u objeto que se suscribe a un evento del emisor y proporciona un método (manejador del evento) que se llama cuando se dispara el evento.
  • Manejador de evento (Event Handler): Método del suscriptor que coincide con la firma del delegado del evento.

Ejemplo de declaración y uso:

// Declaración del delegado, si no se usa el predefinido EventHandler
public delegate void MyEventHandler(object sender, EventArgs e);

// Clase emisor
public class Publisher
{
    // Declaración del evento usando el delegado
    public event MyEventHandler MyEvent;

    public void DoSomething()
    {
        // Disparar el evento (si hay suscriptores)
        OnMyEvent(EventArgs.Empty);
    }

    // Método para disparar el evento (protegiéndolo de null)
    protected virtual void OnMyEvent(EventArgs e)
    {
        MyEvent?.Invoke(this, e);
    }
}

// Clase suscriptora
public class Subscriber
{
    public void Subscribe(Publisher publisher)
    {
        // Suscripción al evento
        publisher.MyEvent += HandleMyEvent;
    }

    public void Unsubscribe(Publisher publisher)
    {
        // Cancelar suscripción al evento
        publisher.MyEvent -= HandleMyEvent;
    }

    // Manejador del evento
    private void HandleMyEvent(object sender, EventArgs e)
    {
        Console.WriteLine("¡El evento se disparó!");
    }
}

// Uso de ejemplo
public class Program
{
    public static void Main(string[] args)
    {
        Publisher pub = new Publisher();
        Subscriber sub = new Subscriber();

        sub.Subscribe(pub); // Suscripción

        pub.DoSomething(); // Dispara el evento

        sub.Unsubscribe(pub); // Cancelar suscripción (opcional)
    }
}

Los eventos proporcionan un acoplamiento débil (loose coupling) entre objetos, permitiéndoles interactuar sin conocimiento directo de la implementación del otro.