Junior — Middle
Чӣ гуна фарқ кардани намоянда ва ҳодиса ва чӣ фарқиятҳои асосӣ доранд?
sobes.tech AI
Ҷавоб аз AI
В C# делегат е тип, който представлява препратка към метод с определена сигнатура. Делегатите позволяват косвено извикване на методи, като ги предават като параметри или ги съхраняват за последващ извик.
Събитие е механизъм, базиран на делегати, който се използва за уведомяване на абонатите за настъпването на дадено действие или промяна в състоянието. Събитието инкапсулира делегата и ограничава достъпа до него: абонатите могат само да добавят или премахват обработчици, но не могат да извикат събитието директно.
Основни разлики:
- Делегатът е тип, събитието е член на клас, който използва делегат.
- Делегатът може да бъде извикан директно, събитието не (извикването на събитието е възможно само в рамките на класа, където е обявено).
- Събитието осигурява инкапсулация и сигурност, предотвратявайки произволни извиквания отвън.
Пример:
public delegate void Notify(string message); // делегат
public class Process
{
public event Notify ProcessCompleted; // събитие
public void Start()
{
// ... изпълнение на процеса
OnProcessCompleted("Процесът е завършен");
}
protected virtual void OnProcessCompleted(string msg)
{
ProcessCompleted?.Invoke(msg); // извикване на събитието
}
}
// Използване:
var process = new Process();
process.ProcessCompleted += msg => Console.WriteLine(msg); // абонамент
process.Start();