Junior — Middle
Come distinguere un delegato da un evento e quali sono le loro principali differenze?
sobes.tech AI
Risposta dell'AI
In C# il delegato è un tipo che rappresenta un riferimento a un metodo con una firma specifica. I delegati consentono di chiamare metodi in modo indiretto, passando i metodi come parametri o memorizzandoli per un uso successivo.
L’evento è un meccanismo basato sui delegati, utilizzato per notificare agli iscritti l’avvenimento di un’azione o di un cambiamento di stato. L’evento incapsula il delegato e limita l’accesso ad esso: gli iscritti possono solo aggiungere o rimuovere gestori, ma non possono invocare direttamente l’evento.
Principali differenze:
- Il delegato è un tipo, l’evento è un membro di classe che utilizza un delegato.
- Il delegato può essere invocato direttamente, l’evento no (l’invocazione dell’evento è possibile solo all’interno della classe in cui è dichiarato).
- L’evento garantisce incapsulamento e sicurezza, prevenendo chiamate arbitrarie ai gestori dall’esterno.
Esempio:
public delegate void Notify(string message); // delegato
public class Process
{
public event Notify ProcessCompleted; // evento
public void Start()
{
// ... esecuzione del processo
OnProcessCompleted("Processo completato");
}
protected virtual void OnProcessCompleted(string msg)
{
ProcessCompleted?.Invoke(msg); // invocazione dell’evento
}
}
// Uso:
var process = new Process();
process.ProcessCompleted += msg => Console.WriteLine(msg); // sottoscrizione
process.Start();