Sobes.tech
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();