Programmering

Hvordan utføre lat initialisering i C #

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:

Lat ordrer = 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

        {

            {

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

        {

            {

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.

$config[zx-auto] not found$config[zx-overlay] not found