Delegates e eventos

Delegates e eventos são fundamentais para programação orientada a eventos em C#. Eles permitem criar sistemas flexíveis, desacoplados e reativos, sendo amplamente usados em interfaces gráficas, notificações e frameworks modernos.

O que são Delegates?

Delegates são tipos que representam referências a métodos com uma assinatura específica. Eles permitem armazenar, passar e invocar métodos dinamicamente, funcionando como “ponteiros de função” seguros e tipificados.

Como declarar e usar um Delegate

  1. Declaração de Delegate
public delegate void MeuDelegate(string mensagem);

Esse delegate pode referenciar qualquer método que receba uma string e retorne void.

  1. Criação de Métodos Compatíveis
public static void ExibirMensagem(string msg)
{
Console.WriteLine("Mensagem: " + msg);
}
  1. Instanciação e Invocação
MeuDelegate del = ExibirMensagem;
del("Olá, delegates!");

Saída: Mensagem: Olá, delegates!

  1. Multicast Delegate

Delegates podem referenciar múltiplos métodos usando o operador +=:

del += OutraFuncao;
del("Teste multicast");

Todos os métodos serão chamados na ordem de inscrição.

O que são Eventos?

Eventos são mecanismos que permitem que uma classe notifique outras quando algo relevante acontece. Eles são baseados em delegates e seguem o padrão publisher/subscriber: um objeto “publica” o evento e outros “assinam” para serem notificados.

Como declarar e usar um Evento

  1. Definição do Delegate e Evento
public delegate void AlertaHandler(string mensagem);
public event AlertaHandler Alerta;
  1. Disparando o Evento
public void DispararAlerta(string msg)
{
if (Alerta != null)
Alerta(msg);
}
  1. Assinando o Evento
MinhaClasse obj = new MinhaClasse();
obj.Alerta += ExibirMensagem;
obj.DispararAlerta("Evento disparado!");

O método ExibirMensagem será chamado quando o evento for disparado.

Exemplo Prático Completo

using System;

public class SensorTemperatura
{
public delegate void TemperaturaAlteradaHandler(int novaTemperatura);
public event TemperaturaAlteradaHandler TemperaturaAlterada;

private int _temperatura;
public int Temperatura
{
get { return _temperatura; }
set
{
if (_temperatura != value)
{
_temperatura = value;
TemperaturaAlterada?.Invoke(_temperatura);
}
}
}
}

class Program
{
static void Main()
{
SensorTemperatura sensor = new SensorTemperatura();
sensor.TemperaturaAlterada += temp => Console.WriteLine($"Nova temperatura: {temp}");

sensor.Temperatura = 25; // Saída: Nova temperatura: 25
sensor.Temperatura = 30; // Saída: Nova temperatura: 30
}
}

Neste exemplo, sempre que a temperatura é alterada, o evento é disparado e os assinantes são notificados.

Resumo

  • Delegates permitem referenciar métodos dinamicamente.
  • Eventos usam delegates para notificar assinantes sobre ocorrências.
  • São essenciais para programação orientada a eventos, como interfaces gráficas e notificações em sistemas C#.