Sobes.tech
Junior — Middle

Cum să distingi un delegat de un eveniment și care sunt principalele lor diferențe?

sobes.tech AI

Răspuns de la AI

În C# delegatul este un tip care reprezintă o referință la o metodă cu o semnătură specifică. Delegatii permit apelarea metodelor indirect, transmitându-le ca parametri sau stocându-le pentru apeluri ulterioare.

Evenimentul este un mecanism bazat pe delegați, utilizat pentru a notifica abonații despre apariția unei acțiuni sau schimbări de stare. Evenimentul encapsulează delegatul și limitează accesul la acesta: abonații pot doar să adauge sau să elimine handleri, dar nu pot apela direct evenimentul.

Diferențele principale:

  • Delegatul este un tip, evenimentul este un membru al clasei care utilizează un delegat.
  • Delegatul poate fi invocat direct, evenimentul nu (apelul evenimentului este posibil doar în interiorul clasei în care este declarat).
  • Evenimentul asigură încapsulare și siguranță, prevenind apelurile arbitrare ale handlerilor din exterior.

Exemplu:

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

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

    public void Start()
    {
        // ... executarea procesului
        OnProcessCompleted("Proces finalizat");
    }

    protected virtual void OnProcessCompleted(string msg)
    {
        ProcessCompleted?.Invoke(msg); // apelarea evenimentului
    }
}

// Utilizare:
var process = new Process();
process.ProcessCompleted += msg => Console.WriteLine(msg); // abonare
process.Start();