Lat initialisering er en teknikk som avviser oppretting av et objekt til første gang det er nødvendig. Initialisering av objektet skjer med andre ord bare på forespørsel. Merk at begrepene lat initialisering og lat instantiering betyr det samme - de kan brukes om hverandre. Ved å dra nytte av lat initialisering kan du forbedre applikasjonens ytelse ved å unngå unødvendig beregning og minneforbruk. I denne artikkelen ser vi på hvordan vi kan utføre lat initialisering i C #.
La oss forstå lat belastning med et enkelt eksempel. Vurder to klasser, Kunde
og Rekkefølge
. De Kunde
klasse inneholder en Ordrene
eiendom som igjen refererer til en samling forekomster av Rekkefølge
klasse. De Ordrene
samlingen kan inneholde en stor mengde data og kan til og med trenge en databasetilkobling for å koble til databasen og hente poster. I et slikt tilfelle er det ingen vits i å laste inn data i Ordrene
eiendom til vi trenger dataene. Lat initialisering lar oss laste inn Ordrene
innsamling bare når dataene blir bedt om.
Bruke Lazy-klassen i C #
Selv om du kan skrive din egen tilpassede kode for å implementere lat initialisering, anbefaler Microsoft å bruke Lat
klasse i stedet. De Lat
klasse i System
navneområdet i C # ble introdusert som en del av .Net Framework 4.0 for å gi en trådsikker måte å implementere lat initialisering på. Du kan dra nytte av denne klassen for å utsette initialiseringen av ressurskrevende objekter i applikasjonen din.
Når du bruker Lat
klasse, må du spesifisere typen objekt du har tenkt å lage lat i typeargumentet. Merk at lat initialisering skjer når du åpner Lat. Verdi
eiendom. Her er et eksempel på hvordan Lat
klasse kan brukes:
Latordrer = nye Lazy (); IEtallbart resultat = lazyOrders.Value;
Vurder nå to klasser, Forfatter
og Blogg
. En forfatter kan skrive mange blogginnlegg, så du har et forhold mellom mange Forfatter
og Blogg
klasser som vist i kodebiten nedenfor.
offentlig klasse Forfatter{
offentlig int Id {get; sett; }
offentlig streng Fornavn {get; sett; }
offentlig streng Etternavn {get; sett; }
public string Address {get; sett; }
offentlige listeblogger {get; sett; }
}
offentlig klasse Blogg
{
offentlig int Id {get; sett; }
public string Tittel {get; sett; }
offentlig DateTime PublicationDate {get; sett; }
}
Merk at forholdet mellom mange og flere Forfatter
og Blogg
klasser har blitt representert ved hjelp av a Liste
eiendom (av type Blogg
) i Forfatter
klasse. Ved å bruke denne egenskapen, Forfatter
klasse kan inneholde en samling av en eller flere forekomster av Blogg
klasse.
Anta at vi bare må vise detaljene til en forfatter (fornavn, etternavn og adresse) i brukergrensesnittet. Det er ingen vits i å laste inn bloggdetaljene til forfatteren i dette tilfellet; vi vil laste bloggdetaljene lat. Her er det oppdaterte Forfatter
klasse som ivaretar dette behovet. Legg merke til bruken av Lat
klasse.
offentlig klasse Forfatter{
offentlig int Id {get; sett; }
offentlig streng Fornavn {get; sett; }
offentlig streng Etternavn {get; sett; }
public string Address {get; sett; }
offentlig lat
Blogger => nye Lat (() => GetBlogDetailsForAuthor (this.Id)); privat IList GetBlogDetailsForAuthor (int Id)
{
// Skriv kode her for å hente alle blogdetaljer for en forfatter.
}
}
Bruke den generiske Lazy-klassen i C #
La oss nå se på hvordan vi kan dra nytte av en generikk Lat
klasse for å implementere Singleton designmønsteret. (Du kan lese artikkelen min om Singleton designmønsteret her.) Følgende versjon av StateManager
klasse er trådsikker. Samtidig demonstrerer det lat initialisering. Merk at den eksplisitte statiske konstruktøren har blitt brukt for å sikre at C # -kompilatoren ikke merker typen som førfeltinit
.
offentlig forseglet klasse StateManager{
private StateManager ()
{
}
offentlig statisk StateManager Instance
{
få
{
returnere Nested.obj;
}
}
privat klasse Nestet
{
statisk nestet ()
{
}
intern statisk readonly StateManager obj = new StateManager ();
}
}
Her er en lat implementering av StateManager
klasse som utnytter Lat
klasse. Du kan se hvordan Lat
klasse gjør det veldig enkelt å implementere latskap.
offentlig klasse StateManager{
privat statisk readonly Lazy obj = new Lazy (() => new StateManager ());
private StateManager () {}
offentlig statisk StateManager Instance
{
få
{
retur obj. Verdi;
}
}
}
Ta en titt på Forekomst
eiendom i StateManager
klasse over. Merk at Verdi
egenskapen du ser i kodeeksempelet ovenfor, er skrivebeskyttet. Av den grunn er det ingen angitt tilgang.
Lat initialisering er en utmerket ytelseoptimaliseringsteknikk, slik at du kan utsette initialiseringen av objekter som bruker betydelige CPU- og minneressurser til du absolutt trenger dem. Dra nytte av lat initialisering for å forbedre ytelsen til appene dine.