Τα Delegates στη γλώσσα προγραμματισμού C-Sharp

Τα Delegates στη γλώσσα προγραμματισμού C-Sharp

Τα Delegates στη γλώσσα προγραμματισμού C-Sharp παρομοιάζονται με δείκτες σε συνάρτηση σε γλώσσες όπως οι C και C++. Ένα delegate είναι ένας τύπος μεταβλητής αναφοράς και αποθηκεύει στο εσωτερικό του ως τιμή μία συγκεκριμένη αναφορά σε κάποια μέθοδο ή συνάρτηση. Η αναφορά μπορεί να μεταβληθεί κατά το runtime όπως ακριβώς μπορεί να μεταβληθεί και η τιμή μίας μεταβλητής ακεραίου τύπου (int).

Η χρήση των delegates ενδείκνυται για την δημιουργία και πραγματοποίηση events κατά το runtime καθώς και για κλήσεις άλλων αντικειμένων ή ενημέρωση μεταβλητών και παραμέτρων άλλων αντικειμένων (λειτουργία call-back). Όλα τα delegates κατάγονται και παράγονται από τη διαθέσιμη κλάση System.Delegate class.

Τα Delegates στη γλώσσα προγραμματισμού C-Sharp: σύνταξη δήλωσης τύπου

Κατά τη δήλωση ενός delegate καθορίζονται σαφώς οι μέθοδοι στις οποίες αυτό θα αναφέρεται. Για τη σύνδεσή του με τις αναφερόμενες μεθόδους, πρέπει το delegate να έχει την ίδια μορφή με τη μέθοδο στην οποία αναφέρεται. Εάν για παράδειγμα θέλουμε να δημιουργήσουμε ένα delegate το οποίο να αναφέρεται σε συνάρτηση που δέχεται ως όρισμα τιμή ακεραίου τύπου (int) και επιστρέφει- μετά την κλήση της- τιμή τύπου συμβολοσειράς (string), τότε το delegate πρέπει να είναι ακριβώς της ίδιας μορφής για να μπορέσει να ολοκληρωθεί η αναφορά και κλήση στην επιθυμητή μέθοδο.

Για την παραπάνω περίπτωση, η σύνταξη είναι η ακόλουθη:

public delegate string delegateConverter (int intNumber);

Ας μελετήσουμε μία προς μία τις λέξεις που χρησιμοποιούνται για τη σύνταξη δήλωσης του delegate:

  • Η δεσμευμένη λέξη public χρησιμοποιείται για να καταστήσει δυνατή την κλήση του delegate από όλα τα σημεία του προγράμματος. Συνήθως αποφεύγεται να δημοσιοποιείται η ίδια η μέθοδος μίας κλάσης στο κυρίως πρόγραμμα για κάλυψη των αναγκών προστασίας και ελαχιστοποίησης προσβασιμότητας, οπότε ως δεσμευμένες λέξεις εμβέλειας χρησιμοποιούνται οι protected και private. Για το λόγο αυτό, ένα delegate με εμβέλεια public αποδεικνύεται ιδιαίτερα χρήσιμο ως διαμεσολαβητής για την κλήση της κρυφής συνάρτησης.
  • Η δεσμευμένη λέξη delegate συντάσσεται για να δηλώσει τον τύπο του αντικειμένου που δημιουργείται.
  • Η λέξη string υποδεικνύει ότι το delegate έχει επιστρεφόμενη τιμή τύπου συμβολοσειράς.
  • Η λέξη delegateConverter είναι το όνομα του τύπου του αντικειμένου που θα δημιουργηθεί και μπορεί να αντικατασταθεί με οποιαδήποτε επιτρεπόμενη, μη δεσμευμένη λέξη (πχ. myDelegate, my Converter, x5, κλπ.).
  • Η φράση στην παρένθεση σχετίζεται άμεσα με τα ορίσματα που δέχεται το αντικείμενο και πρέπει οπωσδήποτε να περιέχει για κάθε όρισμα εξ αυτών τον τύπο και το όνομα του ορίσματος. Στο προκείμενο παραδειγμα, ο τύπος του ορίσματος είναι int και το όνομά του intNumber.

Τα Delegates στη γλώσσα προγραμματισμού C-Sharp: σύνταξη δημιουργίας των delegate αντικειμένων

Εφόσον έχει δηλωθεί ένας τύπος delegate, μπορούμε πλέον να δημιουργήσουμε το αντικείμενο και να καθορίσουμε τη συσχέτισή του με τη μέθοδο στην οποία αναφέρεται. Για τη δημιουργία χρησιμοποιούμε απαραίτητα τη δεσμευμένη λέξη new μαζί με τον τύπο του delegate που ορίσαμε , στον οποίο περνάμε ως όρισμα τη μέθοδο στην οποία αναφέρεται. Για παράδειγμα:

public delegate string delegateConverter (int intNumber);
...
delegateConverter converter1 = new delegateConverter(FunctionA);
delegateConverter converter2 = new delegateConverter(FunctionB);

Τα Delegates στη γλώσσα προγραμματισμού C-Sharp : χρήση  και αποτελέσματα (με παράδειγμα)

Το ακόλουθο παράδειγμα επιδεικνύει τον τρόπο δήλωσης, δημιουργίας και χρήσης ενός delegate, το οποίο μπορεί να χρησιμοποιηθεί για αναφορά σε διαφορετικές μεθόδους που έχουν όμως το κοινό χαρακτηριστικό ότι δέχονται ως όρισμα τιμή ακεραίου τύπου (int) και επιστρέφουν -μετά την κλήση τους- τιμή τύπου συμβολοσειράς (string):

using System;

   public delegate string delegateConverter (int intNumber);
   namespace DelegateConsoleApplication
   class DelegateDemonstrate{
      static int num = 10;

      public static string Summing(int x){
        num += x;
        return ("Result of summing = " + num);
      }

      public static string Multiplying(int x){
        num *= x;
        return ("Result of multiplying = " + num);
      }

    static void Main(string[] args){
       //δημιουργία αντικειμένων τύπου delegateConverter

       delegateConverter converter1 = = new delegateConverter(Summing);
       delegateConverter converter2 = new delegateConverte(Multiplying);

       //κλήση των μεθόδων με τη χρήση των αντικειμένων
       //τα δικά μας delegates επιστρέφουν τιμή τύπου string
       //επομένως μπορούμε να τα αξιοποιήσουμε ως string
       Console.WriteLine(converter1(20));
       Console.WriteLine(converter2(20));

       Console.ReadKey();
     }
   }
}

Με την εκτέλεση του παραπάνω κώδικα, το αποτέλεσμα στην οθόνη μας είναι το εξής:

Result of summing = 30
Result of multiplying = 600

Απάντηση

Αυτός ο ιστότοπος χρησιμοποιεί το Akismet για να μειώσει τα ανεπιθύμητα σχόλια. Μάθετε πώς υφίστανται επεξεργασία τα δεδομένα των σχολίων σας.