События (Events) в C#

События (event) в C# используются для реализации механизма уведомлений между объектами. Они позволяют одному объекту оповещать другие о произошедших изменениях.

Объявление и использование событий

Событие определяется с использованием ключевого слова event и типа делегата.

using System;

class EventPublisher
{
    public event Action OnEvent;

    public void TriggerEvent()
    {
        OnEvent?.Invoke();
    }
}

class Program
{
    static void Main()
    {
        EventPublisher publisher = new EventPublisher();
        publisher.OnEvent += () => Console.WriteLine("Событие произошло!");
        publisher.TriggerEvent();
    }
}

Вывод:

Событие произошло!

Подписка и отписка от событий

Методы можно добавлять и удалять из списка обработчиков событий с помощью операторов += и -=.

using System;

class EventPublisher
{
    public event Action OnEvent;

    public void TriggerEvent()
    {
        OnEvent?.Invoke();
    }
}

class Program
{
    static void Handler() => Console.WriteLine("Обработчик вызван");
    
    static void Main()
    {
        EventPublisher publisher = new EventPublisher();
        publisher.OnEvent += Handler;
        publisher.TriggerEvent();
        publisher.OnEvent -= Handler;
        publisher.TriggerEvent();
    }
}

Вывод:

Обработчик вызван

Использование EventHandler и EventHandler<T>

Встроенные делегаты EventHandler и EventHandler<T> упрощают объявление событий.

using System;

class EventPublisher
{
    public event EventHandler<string> OnMessage;

    public void SendMessage(string message)
    {
        OnMessage?.Invoke(this, message);
    }
}

class Program
{
    static void MessageHandler(object sender, string message)
    {
        Console.WriteLine($"Получено сообщение: {message}");
    }

    static void Main()
    {
        EventPublisher publisher = new EventPublisher();
        publisher.OnMessage += MessageHandler;
        publisher.SendMessage("Привет, мир!");
    }
}

Вывод:

Получено сообщение: Привет, мир!

События в C# обеспечивают гибкий механизм взаимодействия между объектами, упрощая реализацию паттерна “наблюдатель” и обработку асинхронных уведомлений.