Sobes.tech
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) между обектите, позволявайки им да взаимодействат без пряко знание за реализацията на другия.