Sobes.tech
Junior

Kas ir notikumi C#?

sobes.tech AI

Atbilde no AI

C# notikumi ir ir notikumu mehānisms, kas balstīts uz "novērotāja" (Observer Pattern) šablonu, ļauj objektam (publicētājam) paziņot citām objektu grupām (abonentiem) par noteikta darbības vai stāvokļa izmaiņu.

Galvenās sastāvdaļas:

  • Publicētājs (Publisher): Klase, kas deklarē notikumu.
  • Notikums (Event): Deklarēts ar atslēgvārdu event. Nosaka metodes signatūru, ko izmantos apstrādātāji.
  • Delegāts (Delegate): Tips, kas nosaka metodes signatūru, kas var tikt parakstītas uz notikumu. Bieži tiek izmantots iepriekš definēts EventHandler vai EventHandler<TEventArgs>.
  • Abonents (Subscriber): Klase vai objekts, kas abonē publicētāja notikumu un nodrošina metodi (notikuma apstrādātāju), kas tiek izsaukta notikuma aktivizēšanas laikā.
  • Notikuma apstrādātājs (Event Handler): Abonenta metode, kas atbilst notikuma delegāta signatūrai.

Piemērs deklarēšanai un izmantošanai:

// Delegāta deklarācija, ja netiek izmantots iepriekš definēts `EventHandler`
public delegate void MyEventHandler(object sender, EventArgs e);

// Publicētāja klase
public class Publisher
{
    // Notikuma deklarācija, izmantojot delegātu
    public event MyEventHandler MyEvent;

    public void DoSomething()
    {
        // Notikuma izsaukšana (ja ir abonenti)
        OnMyEvent(EventArgs.Empty);
    }

    // Metode notikuma izsaukšanai (aizsargāta pret null)
    protected virtual void OnMyEvent(EventArgs e)
    {
        MyEvent?.Invoke(this, e);
    }
}

// Abonenta klase
public class Subscriber
{
    public void Subscribe(Publisher publisher)
    {
        // Abonēšana uz notikumu
        publisher.MyEvent += HandleMyEvent;
    }

    public void Unsubscribe(Publisher publisher)
    {
        // Atteikšanās no abonēšanas
        publisher.MyEvent -= HandleMyEvent;
    }

    // Notikuma apstrādātājs
    private void HandleMyEvent(object sender, EventArgs e)
    {
        Console.WriteLine("Notikums notika!");
    }
}

// Piemērs izmantošanai
public class Program
{
    public static void Main(string[] args)
    {
        Publisher pub = new Publisher();
        Subscriber sub = new Subscriber();

        sub.Subscribe(pub); // Abonēšana

        pub.DoSomething(); // Notikuma izsaukšana

        sub.Unsubscribe(pub); // Atteikšanās (neobligāti)
    }
}

Notikumi nodrošina vāju saistību (loose coupling) starp objektiem, ļaujot tiem sadarboties bez tiešas zināšanas par citu īstenojumu.