Sobes.tech
Junior

O que são eventos em C#?

sobes.tech IA

Resposta da IA

Os eventos em C# são um mecanismo baseado no padrão "observador" (Observer Pattern), que permite a um objeto (emissor) notificar outros objetos (assinantes) sobre a ocorrência de uma ação ou mudança de estado.

Componentes principais:

  • Emissor (Publisher): Classe que declara um evento.
  • Evento (Event): Declaração de um evento usando a palavra-chave event. Define a assinatura do método que os manipuladores usarão.
  • Delegado (Delegate): Tipo que define a assinatura dos métodos que podem inscrever-se em um evento. Frequentemente usa-se o delegado predefinido EventHandler ou EventHandler<TEventArgs>.
  • Assinante (Subscriber): Classe ou objeto que se inscreve em um evento do emissor e fornece um método (manipulador de evento) chamado quando o evento é disparado.
  • Manipulador de evento (Event Handler): Método do assinante que corresponde à assinatura do delegado do evento.

Exemplo de declaração e uso:

// Declaração do delegado, se não usar o predefinido EventHandler
public delegate void MyEventHandler(object sender, EventArgs e);

// Classe emissora
public class Publisher
{
    // Declaração do evento usando o delegado
    public event MyEventHandler MyEvent;

    public void DoSomething()
    {
        // Disparar o evento (se houver assinantes)
        OnMyEvent(EventArgs.Empty);
    }

    // Método para disparar o evento (protegido contra null)
    protected virtual void OnMyEvent(EventArgs e)
    {
        MyEvent?.Invoke(this, e);
    }
}

// Classe assinante
public class Subscriber
{
    public void Subscribe(Publisher publisher)
    {
        // Inscrição no evento
        publisher.MyEvent += HandleMyEvent;
    }

    public void Unsubscribe(Publisher publisher)
    {
        // Cancelar inscrição no evento
        publisher.MyEvent -= HandleMyEvent;
    }

    // Manipulador de evento
    private void HandleMyEvent(object sender, EventArgs e)
    {
        Console.WriteLine("O evento foi acionado!");
    }
}

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

        sub.Subscribe(pub); // Inscrição

        pub.DoSomething(); // Dispara o evento

        sub.Unsubscribe(pub); // Cancelar inscrição (opcional)
    }
}

Eventos proporcionam um acoplamento fraco (loose coupling) entre objetos, permitindo que eles interajam sem conhecimento direto da implementação um do outro.