Sobes.tech
Junior

Ҳодисаҳо дар C# чӣ гунаанд?

sobes.tech AI

Ҷавоб аз AI

Воқеиятҳо дар C# механизмест, ки асос ёфтааст ба намунаи "наблюдатель" (Observer Pattern), ки имкон медиҳад объект (паблишер) дигар объектҳо (подписчикон) огоҳ кунанд дар бораи рӯй додани амал ё тағйироти ҳолат.

Компонентҳои асосӣ:

  • Паблишер (Publisher): Класс, ки рӯйдодро эълон мекунад.
  • Воқеият (Event): Эълон кардани рӯйдод бо истифода аз калимаи калидии event. Сигнатураи усулро муайян мекунад, ки онро коркардкунандагон истифода мебаранд.
  • Делегат (Delegate): Намуд, ки сигнатураи усулҳоро муайян мекунад, ки метавонанд ба рӯйдод обуна шаванд. Одатан, делегати пешфарз EventHandler ё EventHandler<TEventArgs> истифода мешавад.
  • Подписчик (Subscriber): Класс ё объект, ки ба рӯйдоди паблишер обуна мешавад ва усул (коркардкунандаи рӯйдод) медиҳад, ки дар вақти рӯй додан даъват мешавад.
  • Коркардкунандаи рӯйдод (Event Handler): Усули подписчик, ки мувофиқи сигнатураи делегати рӯйдод аст.

Масалан барои эълон ва истифода:

// Эълон кардани делегат, агар делегати пешфарз истифода нашуда бошад
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) байни объектҳо, ки имкон медиҳад онҳо ҳамкорӣ кунанд бе донистани мустақим дар бораи иҷрои якдигар.