Programmering

Sådan udføres doven initialisering i C #

Lazy initialisering er en teknik, der afværger oprettelsen af ​​et objekt indtil første gang det er nødvendigt. Med andre ord sker initialisering af objektet kun efter behov. Bemærk, at udtrykkene doven initialisering og doven instantiering betyder det samme - de kan bruges om hverandre. Ved at udnytte doven initialisering kan du forbedre applikationens ydeevne ved at undgå unødvendig beregning og hukommelsesforbrug. I denne artikel vil vi se på, hvordan vi kan udføre doven initialisering i C #.

Lad os forstå doven belastning med et simpelt eksempel. Overvej to klasser, Kunde og Bestille. Det Kunde klasse indeholder en Ordre:% s egenskab, der igen henviser til en samling af forekomster af Bestille klasse. Det Ordre:% s indsamling kan indeholde en stor mængde data og kan endda have brug for en databaseforbindelse for at oprette forbindelse til databasen og hente poster. I et sådant tilfælde er der ingen mening i at indlæse data i Ordre:% s ejendom indtil vi har brug for dataene. Lazy initialisering giver os mulighed for at indlæse Ordre:% s kun indsamling, når der anmodes om data.

Brug af Lazy-klassen i C #

Selvom du kan skrive din egen brugerdefinerede kode til at implementere doven initialisering, anbefaler Microsoft at bruge Doven klasse i stedet. Det Doven klasse i System navneområdet i C # blev introduceret som en del af .Net Framework 4.0 for at give en trådsikker måde at implementere doven initialisering på. Du kan drage fordel af denne klasse til at udskyde initialiseringen af ​​ressourceintensive objekter i din applikation.

Når du bruger Doven klasse, skal du angive typen af ​​objekt, du agter at oprette doven i typeargumentet. Bemærk, at doven initialisering opstår, når du åbner Doven værdi ejendom. Her er et eksempel på, hvordan Doven klasse kan bruges:

Doven ordrer = nye dovne();

IEtallbart resultat = lazyOrders.Value;

Overvej nu to klasser, Forfatter og Blog. En forfatter kan skrive mange blogindlæg, så du har et en-til-mange forhold mellem Forfatter og Blog klasser som vist i kodestykket nedenfor.

offentlig klasse Forfatter

    {

public int Id {get; sæt; }

offentlig streng Fornavn {get; sæt; }

public string LastName {get; sæt; }

public string Address {get; sæt; }

offentlige listeblogs {get; sæt; }

    }

offentlig klasse Blog

    {

public int Id {get; sæt; }

public string Titel {get; sæt; }

offentlig DateTime PublicationDate {get; sæt; }

    }

Bemærk, at forholdet mellem mange og flere Forfatter og Blog klasser er blevet repræsenteret ved hjælp af en Liste ejendom (af type Blog) i Forfatter klasse. Brug af denne egenskab, Forfatter klasse kan holde en samling af en eller flere forekomster af Blog klasse.

Antag nu, at vi kun skal vise detaljerne om en forfatter (fornavn, efternavn og adresse) i brugergrænsefladen. Der er ingen mening i at indlæse blogoplysningerne til forfatteren i dette tilfælde; vi ønsker at indlæse blogoplysningerne doven. Her er den opdaterede Forfatter klasse, der imødekommer dette behov. Bemærk brugen af Doven klasse.

offentlig klasse Forfatter

    {

public int Id {get; sæt; }

offentlig streng Fornavn {get; sæt; }

public string LastName {get; sæt; }

public string Address {get; sæt; }

offentlig doven Blogs => nye dovne(() => GetBlogDetailsForAuthor (this.Id));

privat IList GetBlogDetailsForAuthor (int Id)

        {

// Skriv kode her for at hente alle blogoplysninger til en forfatter.

        }

    }

Brug af den generiske Lazy klasse i C #

Lad os nu se på, hvordan vi kan drage fordel af en generik Doven klasse til at implementere Singleton design mønster. (Du kan læse min artikel om Singleton-designmønsteret her.) Den følgende version af StateManager klasse er trådsikker. Samtidig demonstrerer det doven initialisering. Bemærk, at den eksplicitte statiske konstruktør er blevet brugt til at sikre, at C # -compilatoren ikke markerer typen som førfeltinit.

offentlig forseglet klasse StateManager

    {

privat StateManager ()

        {

        }

offentlig statisk StateManager-instans

        {

            {

returnere Nested.obj;

            }

        }

privat klasse indlejret

        {

statisk indlejret ()

            {

            }

intern statisk readonly StateManager obj = ny StateManager ();

        }

    }

Her er en doven implementering af StateManager klasse, der udnytter Doven klasse. Du kan se, hvordan Doven klasse gør det virkelig nemt at implementere dovenskab.

offentlig klasse StateManager

    {

privat statisk readonly Lazy obj = new Lazy (() => new StateManager ());

privat StateManager () {}

offentlig statisk StateManager-instans

        {

            {

retur objekt.Værdi;

            }

        }

    }

Se på Instans ejendom i StateManager klasse ovenfor. Bemærk, at Værdi egenskab, du ser i ovenstående kodeeksempel, er skrivebeskyttet. Af den grund er der ingen sæt accessor.

Lazy initialization er en fremragende præstationsoptimeringsteknik, der giver dig mulighed for at udsætte initialiseringen af ​​objekter, der bruger betydelige CPU- og hukommelsesressourcer, indtil du absolut har brug for dem. Udnyt doven initialisering for at forbedre ydeevnen for dine apps.