Programiranje

Kako izvesti leno inicializacijo v C #

Lena inicializacija je tehnika, ki odloži ustvarjanje predmeta, dokler ni prvič potrebna. Z drugimi besedami, inicializacija predmeta se izvede samo na zahtevo. Upoštevajte, da izraza lena inicializacija in lena instanca pomenita isto - uporabljata jih lahko medsebojno. Če izkoristite leno inicializacijo, lahko izboljšate delovanje aplikacije tako, da se izognete nepotrebnim izračunom in porabi pomnilnika. V tem članku bomo preučili, kako lahko v C # izvedemo leno inicializacijo.

Razumimo lenobno nalaganje s preprostim primerom. Razmislite o dveh razredih, Stranka in Naročilo. The Stranka razred vsebuje Naročila lastnost, ki se nato sklicuje na zbirko primerkov datoteke Naročilo razred. The Naročila Zbirka lahko vsebuje veliko količino podatkov in morda celo potrebuje povezavo z bazo podatkov, da se poveže z bazo podatkov in pridobi zapise. V takem primeru ni smisla nalagati podatkov v Naročila lastnine, dokler ne bomo potrebovali podatkov. Lena inicializacija nam omogoča, da naložimo datoteko Naročila zbiranje le, če se zahtevajo podatki.

Uporaba razreda Lazy v jeziku C #

Čeprav lahko za izvajanje lene inicializacije napišete svojo kodo po meri, Microsoft priporoča uporabo Leni namesto tega. The Leni razred v Sistem imenski prostor v C # je bil uveden kot del .Net Framework 4.0, da bi zagotovil varen način za izvajanje lene inicializacije. Ta razred lahko izkoristite za odložitev inicializacije predmetov, ki zahtevajo veliko virov, v vaši aplikaciji.

Ko uporabite Leni razreda, morate v argumentu tipa določiti vrsto predmeta, ki ga želite leno ustvariti. Upoštevajte, da se lena inicializacija zgodi, ko dostopate do Leni.Vrednost lastnine. Tu je primer, kako Leni razred se lahko uporablja:

Leni naročila = novo Leni();

IEnumerable rezultat = lazyOrders.Value;

Zdaj razmislite o dveh razredih, Avtor in Spletni dnevnik. Avtor lahko napiše veliko objav v blogu, tako da imate med seboj razmerje ena proti številkam Avtor in Spletni dnevnik razredi, kot je prikazano v spodnjem delčku kode.

javni razred Avtor

    {

public int Id {get; set; }

javni niz FirstName {get; set; }

javni niz LastName {get; set; }

javni niz Naslov {get; set; }

javni seznam blogih {get; set; }

    }

javni razred Blog

    {

public int Id {get; set; }

javni niz Naslov {get; set; }

javni DateTime PublicationDate {get; set; }

    }

Upoštevajte, da je razmerje med številkami Avtor in Spletni dnevnik razredi so bili predstavljeni z uporabo Seznam lastnost (vrste Spletni dnevnik) v Avtor razred. Z uporabo te lastnosti, Avtor razred lahko vsebuje zbirko enega ali več primerkov Spletni dnevnik razred.

Zdaj predpostavimo, da moramo v uporabniškem vmesniku prikazati samo podrobnosti avtorja (ime, priimek in naslov). V tem primeru avtorja nima smisla nalagati podrobnosti bloga; želimo leno naložiti podrobnosti bloga. Tu je posodobljeno Avtor razred, ki obravnava to potrebo. Upoštevajte uporabo Leni razred.

javni razred Avtor

    {

public int Id {get; set; }

javni niz FirstName {get; set; }

javni niz LastName {get; set; }

javni niz Naslov {get; set; }

javni Leni Blogi => novi Leni(() => GetBlogDetailsForAuthor (this.Id));

zasebno IList GetBlogDetailsForAuthor (int Id)

        {

// Tukaj napišite kodo, če želite pridobiti vse podrobnosti bloga za avtorja.

        }

    }

Uporaba generičnega razreda Lazy v jeziku C #

Poglejmo zdaj, kako lahko izkoristimo generično zdravilo Leni razred za izvedbo vzorca oblikovanja Singleton. (Tu lahko preberete moj članek o vzorcu oblikovanja Singleton.) Naslednja različica StateManager class je varna pred nitmi. Hkrati prikazuje leno inicializacijo. Upoštevajte, da je bil eksplicitni statični konstruktor uporabljen za zagotovitev, da prevajalnik C # ne označi tipa kot beforefieldinit.

javni zapečateni razred StateManager

    {

private StateManager ()

        {

        }

javni statični primerek StateManager

        {

dobili

            {

vrnitev Nested.obj;

            }

        }

zasebni razred Vgnezdeno

        {

statično gnezdo ()

            {

            }

notranji statični samo za branje StateManager obj = new StateManager ();

        }

    }

Tukaj je leno izvajanje StateManager razred, ki izkorišča Leni razred. Lahko vidite, kako Leni razred resnično preprosto izvaja lenobo.

javni razred StateManager

    {

zasebni statični samo za branje Lazy obj = new Lazy (() => new StateManager ());

private StateManager () {}

javni statični primerek StateManager

        {

dobili

            {

vrni obj.Value;

            }

        }

    }

Oglejte si Primer nepremičnine v StateManager razred zgoraj. Upoštevajte, da Vrednost lastnost, ki jo vidite v zgornjem primeru kode, je samo za branje. Iz tega razloga ni nastavljenega dodatka.

Lena inicializacija je odlična tehnika optimizacije zmogljivosti, ki vam omogoča, da odložite inicializacijo predmetov, ki porabijo pomembne CPU in pomnilniške vire, dokler jih ne potrebujete. Izkoristite leno inicializacijo, da izboljšate delovanje svojih aplikacij.