Sobes.tech
Junior — Middle

Como distinguir um delegado de um evento e quais são as suas principais diferenças?

sobes.tech IA

Resposta da IA

Em C# o delegado é um tipo que representa uma referência a um método com uma assinatura específica. Os delegados permitem chamar métodos de forma indireta, passando-os como parâmetros ou armazenando-os para uso posterior.

O evento é um mecanismo baseado em delegados, utilizado para notificar os assinantes sobre a ocorrência de uma ação ou mudança de estado. O evento encapsula o delegado e limita o acesso a ele: os assinantes só podem adicionar ou remover manipuladores, mas não podem invocar o evento diretamente.

Principais diferenças:

  • O delegado é um tipo, o evento é um membro de classe que usa um delegado.
  • O delegado pode ser invocado diretamente, o evento não (a invocação do evento só é possível dentro da classe onde foi declarado).
  • O evento fornece encapsulamento e segurança, prevenindo chamadas arbitrárias aos manipuladores de fora.

Exemplo:

public delegate void Notify(string message); // delegado

public class Process
{
    public event Notify ProcessCompleted; // evento

    public void Start()
    {
        // ... execução do processo
        OnProcessCompleted("Processo concluído");
    }

    protected virtual void OnProcessCompleted(string msg)
    {
        ProcessCompleted?.Invoke(msg); // invocação do evento
    }
}

// Uso:
var process = new Process();
process.ProcessCompleted += msg => Console.WriteLine(msg); // subscrição
process.Start();