Junior
Kas yra įvykiai C#?
sobes.tech AI
Atsakymas iš AI
C# įvykiai yra mechanizmas, pagrįstas "stebėtojo" (Observer Pattern) šablonu, leidžiantis objektui (leidėjui) pranešti kitiems objektams (abonentams) apie tam tikro veiksmo ar būsenos pasikeitimą.
Pagrindiniai komponentai:
- Leidėjas (Publisher): Klasė, kuri deklaruoja įvykį.
- Įvykis (Event): Deklaruojamas naudojant raktinį žodį
event. Nustato metodo signatūrą, kurią naudos apdorotojai. - Delegatas (Delegate): Tipas, apibrėžiantis metodų signatūrą, kurie gali būti prenumeruojami įvykiui. Dažnai naudojamas iš anksto apibrėžtas
EventHandlerarbaEventHandler<TEventArgs>. - Prenumeratorius (Subscriber): Klasė arba objektas, kuris prenumeruoja leidėjo įvykį ir pateikia metodą (įvykio apdorotoją), kuris iškviečiamas įvykio įvykdymo metu.
- Įvykio apdorotojas (Event Handler): Prenumeratoriaus metodas, atitinkantis įvykio delegato signatūrą.
Pavyzdys deklaravimui ir naudojimui:
// Delegato deklaravimas, jei nenaudojamas iš anksto apibrėžtas `EventHandler`
public delegate void MyEventHandler(object sender, EventArgs e);
// Leidėjo klasė
public class Publisher
{
// Įvykio deklaravimas naudojant delegatą
public event MyEventHandler MyEvent;
public void DoSomething()
{
// Įvykio iškvietimas (jei yra prenumeratorių)
OnMyEvent(EventArgs.Empty);
}
// Metodas įvykio iškvietimui (apsaugotas nuo null)
protected virtual void OnMyEvent(EventArgs e)
{
MyEvent?.Invoke(this, e);
}
}
// Prenumeratoriaus klasė
public class Subscriber
{
public void Subscribe(Publisher publisher)
{
// Prenumerata įvykio
publisher.MyEvent += HandleMyEvent;
}
public void Unsubscribe(Publisher publisher)
{
// Atsisakymas prenumeratos
publisher.MyEvent -= HandleMyEvent;
}
// Įvykio apdorotojas
private void HandleMyEvent(object sender, EventArgs e)
{
Console.WriteLine("Įvykis įvyko!");
}
}
// Pavyzdys naudojimui
public class Program
{
public static void Main(string[] args)
{
Publisher pub = new Publisher();
Subscriber sub = new Subscriber();
sub.Subscribe(pub); // Prenumerata
pub.DoSomething(); // Iškvies įvykį
sub.Unsubscribe(pub); // Atsisakymas (pasirinktinai)
}
}
Įvykiai užtikrina silpną sujungimą (loose coupling) tarp objektų, leidžiant jiems sąveikauti be tiesioginės žinojimo apie kitų įgyvendinimą.