Junior — Middle
Jak odróżnić delegata od zdarzenia i jakie są ich główne różnice?
sobes.tech AI
Odpowiedź od AI
W C# delegacie jest typem, który reprezentuje odwołanie do metody o określonej sygnaturze. Delegaty umożliwiają wywoływanie metod pośrednio, przekazując je jako parametry lub zapisując do późniejszego wywołania.
Zdarzenie to mechanizm oparty na delegatach, używany do powiadamiania subskrybentów o wystąpieniu jakiegoś działania lub zmianie stanu. Zdarzenie enkapsuluje delegata i ogranicza dostęp do niego: subskrybenci mogą tylko dodawać lub usuwać obsługiwacze, ale nie mogą wywołać zdarzenia bezpośrednio.
Główne różnice:
- Delegat to typ, zdarzenie to członek klasy korzystający z delegata.
- Delegat może być wywołany bezpośrednio, zdarzenie nie (wywołanie zdarzenia jest możliwe tylko w klasie, w której jest zadeklarowane).
- Zdarzenie zapewnia enkapsulację i bezpieczeństwo, zapobiegając arbitralnym wywołaniom obsługiwaczy z zewnątrz.
Przykład:
public delegate void Notify(string message); // delegat
public class Process
{
public event Notify ProcessCompleted; // zdarzenie
public void Start()
{
// ... wykonanie procesu
OnProcessCompleted("Proces zakończony");
}
protected virtual void OnProcessCompleted(string msg)
{
ProcessCompleted?.Invoke(msg); // wywołanie zdarzenia
}
}
// Użycie:
var process = new Process();
process.ProcessCompleted += msg => Console.WriteLine(msg); // subskrypcja
process.Start();