Sobes.tech
Junior

Mis on sündmused C#-s?

sobes.tech AI

Vastus AI-lt

C# sündmused on mehhanism, mis põhineb "vaataja" (Observer Pattern) mustril, võimaldades objektil (väljastajal) teavitada teisi objekte (tellijad) teatud tegevuse või oleku muutusest.

Peamised komponendid:

  • Väljastaja (Publisher): Klass, mis deklareerib sündmuse.
  • Sündmus (Event): Deklareeritakse kasutades märksõna event. Määrab meetodi signatuuri, mida kasutavad töötlejad.
  • Delegaat (Delegate): Tüüp, mis määrab meetodite signatuuri, mis võivad olla sündmusele tellitud. Sageli kasutatakse eelnevalt määratletud EventHandler või EventHandler<TEventArgs>.
  • Tellija (Subscriber): Klass või objekt, mis tellib väljaandja sündmuse ja pakub meetodit (sündmuse töötleja), mis kutsutakse välja sündmuse toimumisel.
  • Sündmuse töötleja (Event Handler): Tellija meetod, mis vastab sündmuse delegaadi signatuurile.

Näide deklareerimiseks ja kasutamiseks:

// Delegaadi deklareerimine, kui eelnevalt määratletud `EventHandler` ei kasutata
public delegate void MyEventHandler(object sender, EventArgs e);

// Väljastaja klass
public class Publisher
{
    // Sündmuse deklareerimine delegaadi abil
    public event MyEventHandler MyEvent;

    public void DoSomething()
    {
        // Sündmuse kutsumine (kui on tellijaid)
        OnMyEvent(EventArgs.Empty);
    }

    // Meetod sündmuse kutsumiseks (kaitstud null-iga)
    protected virtual void OnMyEvent(EventArgs e)
    {
        MyEvent?.Invoke(this, e);
    }
}

// Tellija klass
public class Subscriber
{
    public void Subscribe(Publisher publisher)
    {
        // Tellimine sündmusele
        publisher.MyEvent += HandleMyEvent;
    }

    public void Unsubscribe(Publisher publisher)
    {
        // Tellimusest loobumine
        publisher.MyEvent -= HandleMyEvent;
    }

    // Sündmuse töötleja
    private void HandleMyEvent(object sender, EventArgs e)
    {
        Console.WriteLine("Sündmus toimus!");
    }
}

// Kasutamise näide
public class Program
{
    public static void Main(string[] args)
    {
        Publisher pub = new Publisher();
        Subscriber sub = new Subscriber();

        sub.Subscribe(pub); // Tellimine

        pub.DoSomething(); // Sündmuse kutsumine

        sub.Unsubscribe(pub); // Tellimusest loobumine (valikuline)
    }
}

Sündmused tagavad nõrga sideme (loose coupling) objektide vahel, võimaldades neil teha koostööd ilma otsese teadmisega teise objekti rakendusest.