Junior
147
questionbank
Что такое события в C#?
Answer from AI
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) между объектами, позволяя им взаимодействовать без прямого знания о реализации друг друга.