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) օբյեկտների միջև, ինչը թույլ է տալիս նրանց համագործակցել առանց միմյանց իրականացման մասին ուղիղ գիտելիքի։