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
EventHandlervaiEventHandler<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.