Ответ
Да, постоянно работаю. События (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, вообще похуй, кто там на него подписался — хоть десять сервисов, хоть ни одного. Он просто орёт в пространство, а кто услышал — тот и молодец. Без этой хуйни пришлось бы ему в лоб знать всех, кого нужно уведомить, и дергать их методы напрямую — пиздец, а не архитектура. Так-то это основа всего: и в оконных приложениях кнопки кликаются, и в асинхронных штуках уведомления летят — везде эта же самая, блядь, концепция.