Sobes.tech
Junior
148
questionbank

Что такое события в C#?

Ответ от нейросети

sobes.tech AI

События в C# — это механизм, основанный на шаблоне "наблюдатель" (Observer Pattern), позволяющий объекту (издателю) уведомлять другие объекты (подписчиков) о наступлении определенного действия или изменения состояния.

Основные компоненты:

  • Издатель (Publisher): Класс, объявляющий событие.
  • Событие (Event): Объявление события с использованием ключевого слова event. Определяет сигнатуру метода, который будут использовать обработчики.
  • Делегат (Delegate): Тип, определяющий сигнатуру методов, которые могут быть подписаны на событие. Часто используется предопределенный делегат EventHandler или EventHandler<TEventArgs>.
  • Подписчик (Subscriber): Класс или объект, который подписывается на событие издателя и предоставляет метод (обработчик события), вызываемый при срабатывании события.
  • Обработчик события (Event Handler): Метод подписчика, соответствующий сигнатуре делегата события.

Пример объявления и использования:

// Объявление делегата, если не используется предопределенный EventHandler
public delegate void MyEventHandler(object sender, EventArgs e);

// Класс издателя
public class Publisher
{
    // Объявление события с использованием делегата
    public event MyEventHandler MyEvent;

    public void DoSomething()
    {
        // Вызов события (если есть подписчики)
        OnMyEvent(EventArgs.Empty);
    }

    // Метод для вызова события (защищен от null)
    protected virtual void OnMyEvent(EventArgs e)
    {
        MyEvent?.Invoke(this, e);
    }
}

// Класс подписчика
public class Subscriber
{
    public void Subscribe(Publisher publisher)
    {
        // Подписка на событие
        publisher.MyEvent += HandleMyEvent;
    }

    public void Unsubscribe(Publisher publisher)
    {
        // Отписка от события
        publisher.MyEvent -= HandleMyEvent;
    }

    // Обработчик события
    private void HandleMyEvent(object sender, EventArgs e)
    {
        Console.WriteLine("Событие сработало!");
    }
}

// Пример использования
public class Program
{
    public static void Main(string[] args)
    {
        Publisher pub = new Publisher();
        Subscriber sub = new Subscriber();

        sub.Subscribe(pub); // Подписка

        pub.DoSomething(); // Вызывает событие

        sub.Unsubscribe(pub); // Отписка (опционально)
    }
}

События обеспечивают слабую связанность (loose coupling) между объектами, позволяя им взаимодействовать без прямого знания о реализации друг друга.