Sobes.tech
Junior

Τι είναι ένας delegate στο C#;

sobes.tech AI

Απάντηση από AI

Ένας delegate είναι ένας τύπος αναφοράς που δηλώνεται με τη λέξη-κλειδί delegate. Περιλαμβάνει μια μέθοδο με μια συγκεκριμένη υπογραφή (τύπο επιστροφής και τύπους παραμέτρων). Στην ουσία, ένας delegate είναι ένας τύπος-ασφαλής δείκτης σε μια μέθοδο.

Βασικά χαρακτηριστικά των delegates:

  • Ενσωμάτωση μεθόδων: Ο delegate αποθηκεύει πληροφορίες σχετικά με τη μέθοδο στην οποία αναφέρεται.
  • Ασφάλεια τύπων: Ο delegate μπορεί να αναφέρεται μόνο σε μεθόδους των οποίων η υπογραφή ταιριάζει ακριβώς με αυτή του delegate.
  • Πολυαριθμία (Multicast): Οι delegates μπορούν να αναφέρονται σε πολλές μεθόδους ταυτόχρονα. Όταν καλείται ένας delegate, καλούνται όλες οι συνδεδεμένες μέθοδοι με τη σειρά που προστέθηκαν.

Παράδειγμα δήλωσης και χρήσης:

// Δήλωση delegate
public delegate int MyDelegate(int x, int y);

// Μέθοδος που ταιριάζει με την υπογραφή του delegate
public class Calculator
{
    public int Add(int a, int b)
    {
        return a + b;
    }
}

// Χρήση του delegate
public class Program
{
    public static void Main(string[] args)
    {
        Calculator calc = new Calculator();

        // Δημιουργία στιγμιότυπου delegate και σύνδεση με τη μέθοδο Add
        MyDelegate del = new MyDelegate(calc.Add);

        // Κλήση της μεθόδου μέσω του delegate
        int result = del(5, 3);
        System.Console.WriteLine(result); // Εμφάνιση: 8
    }
}

Με την εισαγωγή του .NET Framework 3.5 και LINQ, οι ενσωματωμένοι γενικοί delegates έγιναν ευρέως διαδεδομένοι:

  • Action<T1, ..., Tn>: Delegate που δεν επιστρέφει τιμή (void). Μπορεί να δεχτεί από 0 έως 16 παραμέτρους διαφορετικών τύπων.
  • Func<T1, ..., Tn, TResult>: Delegate που επιστρέφει μια τιμή τύπου TResult. Μπορεί να δεχτεί από 0 έως 16 παραμέτρους διαφορετικών τύπων.
  • Predicate<T>: Delegate που δέχεται μια παράμετρο τύπου T και επιστρέφει μια boolean τιμή. Χρησιμοποιείται για τον έλεγχο συνθηκών.

Πίνακας σύγκρισης των ενσωματωμένων delegates:

Delegate Τύπος επιστροφής Παράμετροι Παράδειγμα χρήσης
Action void 0..16 παράμετροι Εκτέλεση ενέργειας χωρίς επιστροφή τιμής
Func<TResult> TResult 0 παράμετροι + επιστροφή TResult Υπολογισμός χωρίς εισόδους
Func<T, TResult> TResult 1 παράμετρος τύπου T + TResult Μετατροπή τιμής
Predicate<T> bool 1 παράμετρος τύπου T Έλεγχος συνθήκης

Οι delegates χρησιμοποιούνται ευρέως στη διαχείριση γεγονότων, ασύγχρονες λειτουργίες, LINQ και για υλοποίηση callbacks.