Работал ли с событиями (Events) в C#?

Ответ

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

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

// 1. Объявление делегата для события (стандартный шаблон EventHandler<T>)
public class OrderEventArgs : EventArgs
{
    public string OrderId { get; set; }
}

// 2. Класс-издатель (Publisher)
public class OrderService
{
    // Объявление события с использованием обобщенного делегата EventHandler<T>
    public event EventHandler<OrderEventArgs> OrderPlaced;

    public void PlaceOrder(string orderId)
    {
        // Логика размещения заказа...
        Console.WriteLine($"Заказ {orderId} создан.");

        // 3. Вызов события (уведомление подписчиков)
        OnOrderPlaced(new OrderEventArgs { OrderId = orderId });
    }

    // Виртуальный метод для безопасного вызова события
    protected virtual void OnOrderPlaced(OrderEventArgs e)
    {
        OrderPlaced?.Invoke(this, e); // Проверка на null перед вызовом
    }
}

// 4. Класс-подписчик (Subscriber)
public class NotificationService
{
    public void Subscribe(OrderService orderService)
    {
        // Подписка на событие
        orderService.OrderPlaced += HandleOrderPlaced;
    }

    // Обработчик события
    private void HandleOrderPlaced(object sender, OrderEventArgs e)
    {
        Console.WriteLine($"Уведомление: Заказ {e.OrderId} готов к обработке.");
    }
}

// Использование
var orderService = new OrderService();
var notifier = new NotificationService();
notifier.Subscribe(orderService);
orderService.PlaceOrder("ORD-12345");

Зачем это нужно: События обеспечивают слабую связность (loose coupling). Класс-издатель не знает о конкретных подписчиках, а лишь предоставляет точку для подписки. Это фундаментальный механизм для реализации реактивного программирования, UI-событий (WinForms, WPF) и межмодульного взаимодействия.

Ответ 18+ 🔞

Ну ты смотри, опять эти события в C#... Как будто без них нельзя, а на самом деле без них — ваще никуда. Это ж типа шаблон "Наблюдатель", только в наших, родных, шарповых дебрях. Один объект орёт на всех, что у него что-то случилось, а другие, кто подписался на его крики, — сразу вжух и реагируют. Красота, блядь.

Смотри, как это выглядит в коде, чтоб не быть теоретическим пиздаболом:

// 1. Это типа аргументы для нашего события. Наследник от EventArgs, всё как у взрослых.
public class OrderEventArgs : EventArgs
{
    public string OrderId { get; set; }
}

// 2. Это наш базарный главарь, который будет орать.
public class OrderService
{
    // Вот само событие. Объявляешь и всё — точка подписки готова.
    public event EventHandler<OrderEventArgs> OrderPlaced;

    public void PlaceOrder(string orderId)
    {
        // Ну тут логика какая-то, заказ создаётся...
        Console.WriteLine($"Заказ {orderId} создан.");

        // 3. А вот тут мы и начинаем орать на всех подписчиков: "Йоу, заказ-то готов!"
        OnOrderPlaced(new OrderEventArgs { OrderId = orderId });
    }

    // Это типа защищённый метод, чтобы орать культурно и с проверкой, что хоть кто-то слушает.
    protected virtual void OnOrderPlaced(OrderEventArgs e)
    {
        OrderPlaced?.Invoke(this, e); // Эта штука (?.) — чтоб не вылететь, если подписчиков ноль.
    }
}

// 4. А это уже один из тех, кто подслушивает под дверью.
public class NotificationService
{
    public void Subscribe(OrderService orderService)
    {
        // Вешаем свою лапшу на уши издателю. "+=" — это и есть подписка.
        orderService.OrderPlaced += HandleOrderPlaced;
    }

    // А это уже наша реакция на крик. Получили пинок — пошевелились.
    private void HandleOrderPlaced(object sender, OrderEventArgs e)
    {
        Console.WriteLine($"Уведомление: Заказ {e.OrderId} готов к обработке.");
    }
}

// Ну и демонстрация, как это всё вместе дымится.
var orderService = new OrderService();
var notifier = new NotificationService();
notifier.Subscribe(orderService);
orderService.PlaceOrder("ORD-12345");

А зачем этот цирк, спросишь? Да затем, ёпта, чтобы всё было слабо связано. Издатель, этот OrderService, вообще похуй, кто там на него подписался — хоть десять сервисов, хоть ни одного. Он просто орёт в пространство, а кто услышал — тот и молодец. Без этой хуйни пришлось бы ему в лоб знать всех, кого нужно уведомить, и дергать их методы напрямую — пиздец, а не архитектура. Так-то это основа всего: и в оконных приложениях кнопки кликаются, и в асинхронных штуках уведомления летят — везде эта же самая, блядь, концепция.