Προγραμματισμός

Τα δύο σεντ μου σχετικά με τη λέξη-κλειδί απόδοσης στο C #

Η λέξη-κλειδί απόδοσης, που παρουσιάστηκε για πρώτη φορά στο C # 2.0, T επιστρέφει ένα αντικείμενο που εφαρμόζει τη διεπαφή IEnumerable. Η διασύνδεση IEnumerable εκθέτει έναν IEnumerator που μπορεί να χρησιμοποιηθεί για να επαναλάβει μια μη γενική συλλογή χρησιμοποιώντας έναν βρόχο foreach στο C #. Μπορείτε να χρησιμοποιήσετε τη λέξη-κλειδί απόδοσης για να υποδείξετε ότι η μέθοδος ή ένας βοηθός πρόσβασης στον οποίο έχει χρησιμοποιηθεί είναι επαναληπτικός.

Υπάρχουν δύο τρόποι με τους οποίους μπορείτε να χρησιμοποιήσετε τη λέξη-κλειδί απόδοσης: Χρησιμοποιώντας τις δηλώσεις "απόδοση απόδοσης" και "διακοπή απόδοσης". Η σύνταξη και των δύο φαίνεται παρακάτω.

απόδοση απόδοσης ·

διάλειμμα απόδοσης

Γιατί πρέπει να χρησιμοποιήσω τη λέξη-κλειδί απόδοσης;

Η λέξη-κλειδί απόδοσης μπορεί να κάνει μια πλήρη επανάληψη χωρίς την ανάγκη δημιουργίας προσωρινής συλλογής. Με άλλα λόγια, όταν χρησιμοποιείτε τη δήλωση "απόδοση επιστροφής" μέσα σε έναν επαναληπτικό, δεν χρειάζεται να δημιουργήσετε μια προσωρινή συλλογή για να αποθηκεύσετε δεδομένα πριν από την επιστροφή τους. Μπορείτε να επωφεληθείτε από τη δήλωση απόδοσης απόδοσης για να επιστρέψετε κάθε στοιχείο της συλλογής ένα κάθε φορά και μπορείτε να χρησιμοποιήσετε τη δήλωση "απόδοση απόδοσης" με επαναληπτές σε μια μέθοδο ή έναν βοηθητικό χρήστη.

Σημειώστε ότι το στοιχείο ελέγχου επιστρέφεται στον καλούντα κάθε φορά που εμφανίζεται η δήλωση "απόδοση επιστροφής" και εκτελείται. Το πιο σημαντικό, με κάθε τέτοια κλήση, οι πληροφορίες κατάστασης του καλούντος διατηρούνται έτσι ώστε η εκτέλεση να μπορεί να συνεχιστεί αμέσως μετά τη δήλωση απόδοσης όταν το στοιχείο ελέγχου επιστρέψει.

Ας δούμε ένα παράδειγμα. Το παρακάτω απόσπασμα κώδικα δείχνει πώς μπορεί να χρησιμοποιηθεί η λέξη-κλειδί απόδοσης για την επιστροφή ενός αριθμού Fibonacci. Η μέθοδος δέχεται έναν ακέραιο ως όρισμα που αντιπροσωπεύει τον αριθμό των αριθμών Fibonacci που θα δημιουργηθούν.

Στατικοί IEnumerable GenerateFibonacci Numbers (int n)

       {

για (int i = 0, j = 0, k = 1; i <n; i ++)

          {

απόδοση απόδοσης j;

int temp = j + k;

j = k;

k = temp;

           }

       }

Όπως φαίνεται στο απόσπασμα κώδικα παραπάνω, η δήλωση "απόδοση επιστροφής j;" επιστρέφει τους αριθμούς Fibonacci ένα προς ένα χωρίς έξοδο από το βρόχο "for". Με άλλα λόγια, διατηρούνται οι πληροφορίες κατάστασης. Δείτε πώς μπορεί να κληθεί η μέθοδος GenerateFibonacciNumbers.

foreach (int x σε αριθμούς GenerateFibonacci (10))

   {

Κονσόλα.WriteLine (x);

   }

Όπως μπορείτε να παρατηρήσετε, δεν υπάρχει ανάγκη δημιουργίας μιας ενδιάμεσης λίστας ή πίνακα για να κρατήσετε τους αριθμούς fibonacci που πρέπει να δημιουργηθούν και να επιστραφούν στον καλούντα.

Σημειώστε ότι κάτω από τα εξώφυλλα, η λέξη-κλειδί απόδοσης δημιουργεί μια μηχανή κατάστασης για τη διατήρηση των πληροφοριών κατάστασης. Το MSDN δηλώνει: "Όταν επιτευχθεί μια δήλωση επιστροφής απόδοσης στη μέθοδο επαναλήψεων, η έκφραση επιστρέφεται και διατηρείται η τρέχουσα θέση στον κώδικα. Η εκτέλεση ξεκινά εκ νέου από αυτήν τη θέση την επόμενη φορά που καλείται η συνάρτηση επαναληπτικού.

Ένα άλλο πλεονέκτημα της χρήσης της λέξης-κλειδιού απόδοσης είναι ότι τα στοιχεία που επιστρέφονται δημιουργούνται μόνο κατόπιν ζήτησης. Για παράδειγμα, ο ακόλουθος get accessor επιστρέφει τους ζυγούς αριθμούς μεταξύ 1 και 10.

δημόσια στατικά IEnumerable EvenNumbers

       {

παίρνω

           {

για (int i = 1; i <= 10; i ++)

               {

αν ((i% 2) == 0)

απόδοση απόδοσης i;

               }

           }

       }

Μπορείτε να αποκτήσετε πρόσβαση στη στατική ιδιότητα EvenNumbers για να εμφανίσετε τους ζυγούς αριθμούς μεταξύ 1 και 10 στο παράθυρο της κονσόλας χρησιμοποιώντας το απόσπασμα κώδικα που αναφέρεται παρακάτω

foreach (int i in EvenNumbers)

     {

Console.WriteLine (i);

     }

Μπορείτε να χρησιμοποιήσετε τη δήλωση "διακοπή απόδοσης" μέσα σε έναν επαναληπτικό όταν δεν υπάρχουν άλλες τιμές που θα επιστραφούν. Η δήλωση "διάλειμμα απόδοσης" χρησιμοποιείται για τον τερματισμό της απαρίθμησης.

δημόσιο IEnumerable GetData (IEnumerable στοιχεία)

{

εάν (null == στοιχεία)

διάλειμμα απόδοσης

foreach (στοιχείο T σε αντικείμενα)

είδος επιστροφής απόδοσης ·

}

Ανατρέξτε στην παραπάνω λίστα κωδικών. Σημειώστε πώς γίνεται ένας έλεγχος για να δείτε αν η παράμετρος "item" είναι μηδενική. Όταν καλείτε τη μέθοδο GetData () μέσα σε έναν επαναληπτικό και με παράμετρο null, το στοιχείο ελέγχου επιστρέφει πίσω στον καλούντα χωρίς να επιστρέφεται καμία τιμή.

Σημεία που πρέπει να θυμάστε

Όταν εργάζεστε με τη λέξη-κλειδί απόδοσης, θα πρέπει να έχετε υπόψη αυτά τα σημεία:

  • Δεν μπορείτε να έχετε τη δήλωση απόδοσης απόδοσης σε ένα μπλοκ δοκιμής, αν και μπορείτε να την έχετε μέσα σε ένα μπλοκ δοκιμής
  • Δεν μπορείτε να έχετε τη δήλωση διακοπής απόδοσης μέσα σε ένα μπλοκ επιτέλους
  • Ο τύπος επιστροφής της μεθόδου όπου έχει χρησιμοποιηθεί η απόδοση, θα πρέπει να είναι IEnumerable, IEnumerable, IEnumerator ή IEnumerator
  • Δεν μπορείτε να έχετε μια παράμετρο ref ή out στη μέθοδο που χρησιμοποιήθηκε η απόδοση
  • Δεν μπορείτε να χρησιμοποιήσετε τις δηλώσεις "απόδοση απόδοσης" ή "διακοπή απόδοσης" μέσα σε ανώνυμες μεθόδους
  • Δεν μπορείτε να χρησιμοποιήσετε τις δηλώσεις "απόδοση απόδοσης" ή τη "διακοπή απόδοσης" μέσα σε "μη ασφαλείς" μεθόδους, δηλαδή μεθόδους που επισημαίνονται με τη λέξη-κλειδί "μη ασφαλής" για να δηλώσετε ένα μη ασφαλές περιβάλλον