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

Πώς να εκτελέσετε τεμπέλης αρχικοποίηση στο C #

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

Ας καταλάβουμε την τεμπέλη φόρτωση με ένα απλό παράδειγμα. Εξετάστε δύο τάξεις, Πελάτης και Σειρά. ο Πελάτης τάξη περιέχει ένα Παραγγελίες ιδιότητα που με τη σειρά του αναφέρεται σε μια συλλογή από παρουσίες του Σειρά τάξη. ο Παραγγελίες Η συλλογή ενδέχεται να περιέχει μεγάλο αριθμό δεδομένων και μπορεί ακόμη και να χρειάζεται σύνδεση βάσης δεδομένων για να συνδεθεί στη βάση δεδομένων και να ανακτήσει εγγραφές. Σε μια τέτοια περίπτωση, δεν έχει νόημα η φόρτωση δεδομένων στο Παραγγελίες ιδιοκτησία έως ότου χρειαζόμαστε τα δεδομένα. Η αργή προετοιμασία μας επιτρέπει να φορτώσουμε το Παραγγελίες συλλογή μόνο όταν ζητούνται τα δεδομένα.

Χρησιμοποιώντας την τάξη Lazy στο C #

Παρόλο που μπορείτε να γράψετε τον δικό σας προσαρμοσμένο κώδικα για να εφαρμόσετε τεμπέλη αρχικοποίηση, η Microsoft συνιστά τη χρήση του Τεμπέλης αντί για τάξη. ο Τεμπέλης τάξη στο Σύστημα namespace στο C # εισήχθη ως μέρος του .Net Framework 4.0 για να παρέχει έναν ασφαλή νήμα τρόπο για την εφαρμογή τεμπέλης αρχικοποίησης. Μπορείτε να επωφεληθείτε από αυτήν την τάξη για να αναβάλλετε την αρχικοποίηση αντικειμένων έντασης πόρου στην εφαρμογή σας.

Όταν χρησιμοποιείτε το Τεμπέλης τάξη, πρέπει να καθορίσετε τον τύπο του αντικειμένου που σκοπεύετε να δημιουργήσετε τεμπέλης στο όρισμα τύπου. Σημειώστε ότι ο τεμπέλης αρχικοποίηση εμφανίζεται όταν έχετε πρόσβαση στο Lazy.Value ιδιοκτησία. Εδώ είναι ένα παράδειγμα για το πώς το Τεμπέλης η τάξη μπορεί να χρησιμοποιηθεί:

Τεμπέλης παραγγελίες = νέο Lazy();

IEnumerable αποτέλεσμα = lazyOrders.Value;

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

δημόσια τάξη Συγγραφέας

    {

δημόσιο int Id {get; σειρά; }

δημόσια συμβολοσειρά FirstName {get; σειρά; }

δημόσια συμβολοσειρά LastName {get; σειρά; }

δημόσια συμβολοσειρά Διεύθυνση {get; σειρά; }

δημόσια λίστα ιστολογίων {get; σειρά; }

    }

δημόσια τάξη Blog

    {

δημόσιο int Id {get; σειρά; }

δημόσια συμβολοσειρά Τίτλος {get; σειρά; }

δημόσια DateTime PublicationDate {get; σειρά; }

    }

Σημειώστε ότι η σχέση one-to-many μεταξύ του Συντάκτης και Ιστολόγιο τα μαθήματα έχουν αναπαρασταθεί χρησιμοποιώντας ένα Λίστα ιδιοκτησία (τύπου) Ιστολόγιο) στο Συντάκτης τάξη. Χρησιμοποιώντας αυτήν την ιδιότητα, το Συντάκτης Η τάξη μπορεί να περιέχει μια συλλογή από μία ή περισσότερες εμφανίσεις του Ιστολόγιο τάξη.

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

δημόσια τάξη Συγγραφέας

    {

δημόσιο int Id {get; σειρά; }

δημόσια συμβολοσειρά FirstName {get; σειρά; }

δημόσια συμβολοσειρά LastName {get; σειρά; }

δημόσια συμβολοσειρά Διεύθυνση {get; σειρά; }

δημόσια Lazy Blogs => νέο Lazy(() => GetBlogDetailsForAuthor (this.Id));

ιδιωτικό IList GetBlogDetailsForAuthor (int Id)

        {

// Γράψτε κώδικα εδώ για να ανακτήσετε όλες τις λεπτομέρειες του ιστολογίου για έναν συγγραφέα.

        }

    }

Χρησιμοποιώντας τη γενική κατηγορία Lazy στο C #

Ας δούμε τώρα πώς μπορούμε να εκμεταλλευτούμε μια γενική Τεμπέλης τάξη για να εφαρμόσει το σχέδιο σχεδίασης Singleton. (Μπορείτε να διαβάσετε το άρθρο μου σχετικά με το μοτίβο σχεδίασης Singleton εδώ.) Η ακόλουθη έκδοση του StateManager η τάξη είναι ασφαλής για νήματα. Ταυτόχρονα, δείχνει τεμπέλη αρχικοποίηση. Σημειώστε ότι ο ρητός στατικός κατασκευαστής έχει χρησιμοποιηθεί για να διασφαλίσει ότι ο μεταγλωττιστής C # δεν επισημαίνει τον τύπο ως πριν από το πεδίο.

δημόσια σφραγισμένη τάξη StateManager

    {

ιδιωτικό StateManager ()

        {

        }

δημόσια στατική κατάσταση StateManager

        {

παίρνω

            {

επιστροφή Nested.obj;

            }

        }

ιδιωτική τάξη Nested

        {

στατικό ένθετο ()

            {

            }

εσωτερικό στατικό readonly StateManager obj = νέο StateManager ();

        }

    }

Εδώ είναι μια τεμπέλη εφαρμογή του StateManager τάξη που αξιοποιεί το Τεμπέλης τάξη. Μπορείτε να δείτε πώς το Τεμπέλης Η τάξη καθιστά πολύ απλή την εφαρμογή της τεμπελιάς

δημόσια τάξη StateManager

    {

ιδιωτικό στατικό για ανάγνωση Lazy obj = new Lazy (() => new StateManager ());

ιδιωτικό StateManager () {}

δημόσια στατική κατάσταση StateManager

        {

παίρνω

            {

επιστροφή obj.Value;

            }

        }

    }

Ρίξτε μια ματιά στο Παράδειγμα ιδιοκτησία στο StateManager τάξη παραπάνω. Σημειώστε ότι το αξία ιδιότητα που βλέπετε στο παραπάνω παράδειγμα κώδικα είναι μόνο για ανάγνωση. Για το λόγο αυτό δεν υπάρχει σετ πρόσβασης.

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