Junior — Middle
Kako razlikovati delegata od događaja i koje su njihove glavne razlike?
sobes.tech АИ
Одговор од АИ
U C#-u, delegat je tip koji predstavlja referencu na metodu sa određenom potpisom. Delegati omogućavaju pozivanje metoda indirektno, prosleđivanjem kao parametara ili čuvanjem za kasniji poziv.
Događaj je mehanizam zasnovan na delegatima, koji se koristi za obaveštavanje pretplatnika o događaju ili promeni stanja. Događaj inkapsulira delegata i ograničava pristup njemu: pretplatnici mogu samo da dodaju ili uklone rukovaoce, ali ne mogu direktno da pozivaju događaj.
Glavne razlike:
- Delegat je tip, događaj je član klase koji koristi delegata.
- Delegat može biti pozvan direktno, događaj ne (poziv događaja je moguć samo unutar klase gde je deklarisan).
- Događaj obezbeđuje enkapsulaciju i sigurnost, sprečavajući proizvoljne pozive rukovalaca spolja.
Primer:
public delegate void Notify(string message); // delegat
public class Process
{
public event Notify ProcessCompleted; // događaj
public void Start()
{
// ... izvršenje procesa
OnProcessCompleted("Proces je završen");
}
protected virtual void OnProcessCompleted(string msg)
{
ProcessCompleted?.Invoke(msg); // poziv događaja
}
}
// Upotreba:
var process = new Process();
process.ProcessCompleted += msg => Console.WriteLine(msg); // pretplata
process.Start();