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:
Dovenordrer = 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
{
få
{
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
{
få
{
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.