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();