Sobes.tech
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) μεταξύ αντικειμένων, επιτρέποντάς τους να αλληλεπιδρούν χωρίς άμεση γνώση της υλοποίησης του άλλου.