Junior — Middle
108
Как отличить делегат от события и в чем их основные отличия?
Ответ от нейросети
sobes.tech 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();