Junior
Какво са събитията в C#?
sobes.tech AI
Отговор от 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) между обектите, позволявайки им да взаимодействат без пряко знание за реализацията на другия.