Programovanie

Ako vykonať lenivú inicializáciu v C #

Lenivá inicializácia je technika, ktorá bráni vytvoreniu objektu, kým nie je potrebné prvýkrát. Inými slovami, inicializácia objektu sa deje iba na požiadanie. Všimnite si, že výrazy lenivá inicializácia a lenivá inštancia znamenajú to isté - môžu sa používať zameniteľne. Využitím výhod lenivej inicializácie môžete zlepšiť výkon aplikácie tak, že sa vyhnete zbytočným výpočtom a spotrebe pamäte. V tomto článku sa pozrieme na to, ako môžeme vykonať línú inicializáciu v C #.

Poďme pochopiť lenivé načítanie na jednoduchom príklade. Zvážte dve triedy, Zákazník a objednať. The Zákazník trieda obsahuje Objednávky vlastnosť, ktorá zase odkazuje na kolekciu inštancií súboru objednať trieda. The Objednávky kolekcia môže obsahovať veľké množstvo údajov a na pripojenie k databáze a načítanie záznamov môže byť dokonca potrebné pripojenie k databáze. V takom prípade nemá zmysel načítať údaje do súboru Objednávky kým nebudeme potrebovať údaje. Lenivá inicializácia nám umožňuje načítať Objednávky zhromažďovanie údajov, iba ak sa od nich vyžaduje údaj.

Používanie triedy Lazy v C #

Aj keď na implementáciu lenivej inicializácie môžete napísať svoj vlastný kód, spoločnosť Microsoft odporúča používať Lenivý triedy namiesto toho. The Lenivý trieda v Systém Obor názvov v C # bol predstavený ako súčasť .Net Framework 4.0, aby poskytol bezpečný spôsob implementácie lenivej inicializácie. Túto triedu môžete využiť na odloženie inicializácie objektov náročných na zdroje vo vašej aplikácii.

Keď použijete Lenivý triedy, musíte v argumente typ lenivo určiť typ objektu, ktorý chcete vytvoriť. Upozorňujeme, že lenivá inicializácia nastane, keď vstúpite do Lenivá. Hodnota nehnuteľnosť. Tu je príklad toho, ako Lenivý trieda môže byť použitá:

Lenivý objednávky = novinka Lazy();

IEnumerable result = lazyOrders.Value;

Teraz zvážte dve triedy, Autor a Blog. Autor môže písať veľa blogových príspevkov, takže medzi nimi existuje vzájomný vzťah Autor a Blog triedy, ako je uvedené v útržku kódu nižšie.

verejná trieda Autor

    {

public int Id {get; sada; }

verejný reťazec FirstName {get; sada; }

verejný reťazec Priezvisko {get; sada; }

public string Adresa {get; sada; }

public List Blogs {get; sada; }

    }

verejná trieda Blog

    {

public int Id {get; sada; }

verejný reťazec Názov {get; sada; }

public DateTime PublicationDate {get; sada; }

    }

Upozorňujeme, že vzťah typu jedna k mnohým medzi Autor a Blog triedy bol zastúpený pomocou a Zoznam majetok (typu Blog) v Autor trieda. Pomocou tejto vlastnosti Autor trieda môže obsahovať kolekciu jednej alebo viacerých inštancií súboru Blog trieda.

Teraz predpokladajme, že v používateľskom rozhraní musíme zobraziť iba podrobnosti o autorovi (meno, priezvisko a adresa). V tomto prípade nemá zmysel načítať podrobnosti blogu pre autora; chceme lenivo načítať podrobnosti blogu. Tu je aktualizácia Autor triedy, ktorá rieši túto potrebu. Všimnite si použitie Lenivý trieda.

verejná trieda Autor

    {

public int Id {get; sada; }

verejný reťazec FirstName {get; sada; }

verejný reťazec Priezvisko {get; sada; }

public string Adresa {get; sada; }

verejné Lazy Blogy => novinka Lazy(() => GetBlogDetailsForAuthor (this.Id));

private IList GetBlogDetailsForAuthor (int Id)

        {

// Sem napíš kód, aby si získal všetky podrobnosti blogu o autorovi.

        }

    }

Používanie všeobecnej triedy Lazy v C #

Pozrime sa teraz na to, ako môžeme využiť generikum Lenivý triedy na implementáciu návrhového vzoru Singleton. (Môj článok o dizajnovom vzore Singleton si môžete prečítať tu.) Nasledujúca verzia StateManager trieda je bezpečná pre vlákna. Zároveň demonštruje lenivú inicializáciu. Upozorňujeme, že sa použil explicitný statický konštruktor na zabezpečenie toho, aby kompilátor C # neoznačil typ ako beforefieldinit.

verejná zapečatená trieda StateManager

    {

private StateManager ()

        {

        }

verejná statická inštancia StateManager

        {

dostať

            {

návrat Nested.obj;

            }

        }

súkromná trieda Vnorené

        {

statické vnorené ()

            {

            }

interné statické iba na čítanie StateManager obj = nový StateManager ();

        }

    }

Tu je lenivá implementácia StateManager triedy, ktorá využíva Lenivý trieda. Môžete vidieť, ako Lenivý triedy je implementácia lenivosti naozaj jednoduchá.

verejná trieda StateManager

    {

private static readonly Lazy obj = new Lazy (() => new StateManager ());

private StateManager () {}

verejná statická inštancia StateManager

        {

dostať

            {

návrat obj. hodnota;

            }

        }

    }

Pozrite sa na Inštancia majetok v StateManager triedy vyššie. Všimnite si, že Hodnota vlastnosť, ktorú vidíte v príklade vyššie, je iba na čítanie. Z tohto dôvodu neexistuje nastavený prístupový objekt.

Lenivá inicializácia je vynikajúca technika optimalizácie výkonu, ktorá vám umožňuje odložiť inicializáciu objektov, ktoré spotrebúvajú značné prostriedky procesora a pamäte, až kým ich absolútne nepotrebujete. Využite lenivú inicializáciu na zlepšenie výkonu svojich aplikácií.

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