Junior
Τι είναι τα γεγονότα σε C#;
sobes.tech AI
Απάντηση από AI
Τα γεγονότα σε C# είναι ένας μηχανισμός βασισμένος στο μοτίβο "παρατηρητής" (Observer Pattern), που επιτρέπει σε ένα αντικείμενο (τον εκδότη) να ειδοποιεί άλλα αντικείμενα (τους συνδρομητές) για την εμφάνιση μιας συγκεκριμένης ενέργειας ή αλλαγής κατάστασης.
Βασικά συστατικά:
- Εκδότης (Publisher): Κλάση που δηλώνει ένα γεγονός.
- Γεγονός (Event): Δήλωση ενός γεγονότος με τη χρήση της λέξης-κλειδιού
event. Ορίζει την υπογραφή της μεθόδου που θα χρησιμοποιούν οι χειριστές. - Δ Delegat (Delegate): Τύπος που ορίζει την υπογραφή των μεθόδων που μπορούν να εγγραφούν σε ένα γεγονός. Συχνά χρησιμοποιείται ο προκαθορισμένος delegate
EventHandlerήEventHandler<TEventArgs>. - Εγγεγραμμένος (Subscriber): Κλάση ή αντικείμενο που εγγράφεται σε ένα γεγονός του εκδότη και παρέχει μια μέθοδο (χειριστής γεγονότος) που καλείται όταν ενεργοποιείται το γεγονός.
- Χειριστής γεγονότος (Event Handler): Μέθοδος του εγγεγραμμένου που ταιριάζει με την υπογραφή του delegate του γεγονότος.
Παράδειγμα δήλωσης και χρήσης:
// Δήλωση delegate, αν δεν χρησιμοποιείται ο προκαθορισμένος EventHandler
public delegate void MyEventHandler(object sender, EventArgs e);
// Κλάση εκδότη
public class Publisher
{
// Δήλωση γεγονότος με delegate
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) μεταξύ αντικειμένων, επιτρέποντάς τους να αλληλεπιδρούν χωρίς άμεση γνώση της υλοποίησης του άλλου.