Sobes.tech
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();