Sobes.tech
Junior

Šta su događaji u C#?

sobes.tech АИ

Одговор од АИ

Догађаји у 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) између објеката, омогућавајући им да сарађују без директног знања о реализацији једни другог.