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