So führen Sie eine verzögerte Initialisierung in C # durch

Die verzögerte Initialisierung ist eine Technik, die die Erstellung eines Objekts aufschiebt, bis es zum ersten Mal benötigt wird. Mit anderen Worten, die Initialisierung des Objekts erfolgt nur bei Bedarf. Beachten Sie, dass die Begriffe "verzögerte Initialisierung" und "verzögerte Instanziierung" dasselbe bedeuten - sie können austauschbar verwendet werden. Indem Sie die verzögerte Initialisierung nutzen, können Sie die Leistung der Anwendung verbessern, indem Sie unnötige Berechnungen und Speicherverbrauch vermeiden. In diesem Artikel werden wir uns ansehen, wie wir eine verzögerte Initialisierung in C # durchführen können.

Lassen Sie uns das verzögerte Laden anhand eines einfachen Beispiels verstehen. Betrachten Sie zwei Klassen Customerund Order. Die CustomerKlasse enthält eine OrdersEigenschaft, die wiederum auf eine Sammlung von Instanzen der OrderKlasse verweist . Die OrdersSammlung kann eine große Datenmenge enthalten und benötigt möglicherweise sogar eine Datenbankverbindung, um eine Verbindung zur Datenbank herzustellen und Datensätze abzurufen. In einem solchen Fall macht es keinen Sinn, Daten in die OrdersEigenschaft zu laden, bis wir die Daten benötigen. Durch die verzögerte Initialisierung können wir die OrdersSammlung nur laden, wenn die Daten angefordert werden.

Verwenden der Lazy-Klasse in C #

Obwohl Sie Ihren eigenen benutzerdefinierten Code schreiben können, um die verzögerte Initialisierung zu implementieren, empfiehlt Microsoft, stattdessen die LazyKlasse zu verwenden. Die LazyKlasse im SystemNamespace in C # wurde als Teil von .Net Framework 4.0 eingeführt, um eine thread-sichere Möglichkeit zum Implementieren einer verzögerten Initialisierung bereitzustellen. Sie können diese Klasse nutzen, um die Initialisierung ressourcenintensiver Objekte in Ihrer Anwendung zu verschieben.

Wenn Sie die LazyKlasse verwenden, müssen Sie im Typargument den Objekttyp angeben, den Sie träge erstellen möchten. Beachten Sie, dass beim Zugriff auf die Lazy.ValueEigenschaft eine verzögerte Initialisierung erfolgt . Hier ist ein Beispiel, wie die LazyKlasse verwendet werden kann:

Faul
   
     Bestellungen = neue Lazy
    
     ();
     

IEnumerable result = lazyOrders.Value;

Betrachten Sie nun zwei Klassen Authorund Blog. Ein Autor kann viele Blog-Beiträge schreiben, sodass Sie eine Eins-zu-Viele-Beziehung zwischen Authorund und BlogKlassen haben, wie im folgenden Code-Snippet gezeigt.

öffentliche Klasse Autor

    {

        public int Id {get; einstellen; }}

        öffentliche Zeichenfolge Vorname {get; einstellen; }}

        öffentlicher String Nachname {get; einstellen; }}

        öffentliche Zeichenfolge Adresse {get; einstellen; }}

        öffentliche Liste Blogs {get; einstellen; }}

    }}

    öffentlicher Blog

    {

        public int Id {get; einstellen; }}

        öffentlicher String Titel {get; einstellen; }}

        public DateTime PublicationDate {get; einstellen; }}

    }}

Beachten Sie, dass die Eins-zu-viele - Beziehung zwischen dem Authorund BlogKlassen hat vertreten mit ListEigenschaft (vom Typ Blogin der) AuthorKlasse. Mit dieser Eigenschaft kann die AuthorKlasse eine Sammlung von einer oder mehreren Instanzen der BlogKlasse enthalten.

Angenommen, wir müssen nur die Details eines Autors (Vorname, Nachname und Adresse) in der Benutzeroberfläche anzeigen. In diesem Fall macht es keinen Sinn, die Blog-Details für den Autor zu laden. Wir möchten die Blog-Details träge laden. Hier ist die aktualisierte AuthorKlasse, die diese Anforderung erfüllt. Beachten Sie die Verwendung der LazyKlasse.

öffentliche Klasse Autor

    {

        public int Id {get; einstellen; }}

        öffentliche Zeichenfolge Vorname {get; einstellen; }}

        öffentlicher String Nachname {get; einstellen; }}

        öffentliche Zeichenfolge Adresse {get; einstellen; }}

        öffentlich faul Blogs => new Lazy (() => GetBlogDetailsForAuthor (this.Id));

        private IList GetBlogDetailsForAuthor (int Id)

        {

       // Schreiben Sie hier Code, um alle Blog-Details für einen Autor abzurufen.

        }}

    }}

Verwenden der generischen Lazy-Klasse in C #

Schauen wir uns nun an, wie wir eine generische LazyKlasse nutzen können, um das Singleton-Entwurfsmuster zu implementieren. (Sie können meinen Artikel über das Singleton-Entwurfsmuster hier lesen.) Die folgende Version der StateManagerKlasse ist threadsicher. Gleichzeitig wird eine verzögerte Initialisierung demonstriert. Beachten Sie, dass der explizite statische Konstruktor verwendet wurde, um sicherzustellen, dass der C # -Compiler den Typ nicht als markiert beforefieldinit.

öffentliche versiegelte Klasse StateManager

    {

        privater StateManager ()

        {

        }}

        öffentliche statische StateManager-Instanz

        {

            bekommen

            {

                return Nested.obj;

            }}

        }}

        Privatklasse verschachtelt

        {

            statisch verschachtelt ()

            {

            }}

            interner statischer schreibgeschützter StateManager obj = neuer StateManager ();

        }}

    }}

Hier ist eine verzögerte Implementierung der StateManagerKlasse, die die LazyKlasse nutzt . Sie können sehen, wie die LazyKlasse es wirklich einfach macht, Faulheit zu implementieren. 

öffentliche Klasse StateManager

    {

        privat statisch schreibgeschützt Lazy obj = new Lazy (() => new StateManager ());

        privater StateManager () {}

        öffentliche statische StateManager-Instanz

        {

            bekommen

            {

                return obj.Value;

            }}

        }}

    }}

Schauen Sie sich die InstanceImmobilie in der StateManagerobigen Klasse an. Beachten Sie, dass die ValueEigenschaft, die Sie im obigen Codebeispiel sehen, schreibgeschützt ist. Aus diesem Grund gibt es keinen eingestellten Accessor.

Die verzögerte Initialisierung ist eine hervorragende Technik zur Leistungsoptimierung, mit der Sie die Initialisierung von Objekten, die erhebliche CPU- und Speicherressourcen verbrauchen, verschieben können, bis Sie sie unbedingt benötigen. Nutzen Sie die verzögerte Initialisierung, um die Leistung Ihrer Apps zu verbessern.