Programavimas

Kaip atlikti tingų inicializavimą C #

Tinginio inicializavimas yra technika, atidedanti objekto sukūrimą iki pirmo karto, kai to reikia. Kitaip tariant, objekto inicijavimas vyksta tik pagal pareikalavimą. Atkreipkite dėmesį, kad terminai tingus inicializavimas ir tingus akimirksnis reiškia tą patį dalyką - juos galima vartoti pakaitomis. Pasinaudoję tingiu inicializavimu, galite pagerinti programos našumą išvengdami nereikalingo skaičiavimo ir atminties sąnaudų. Šiame straipsnyje mes apžvelgsime, kaip galime atlikti tingų inicializavimą C #.

Supraskime tingų krovimą paprastu pavyzdžiu. Apsvarstykite dvi klases, Klientas ir Įsakymas. Klientas klasėje yra Užsakymai nuosavybė, kuri savo ruožtu nurodo rinkinį Įsakymas klasė. Užsakymai Kolekcijoje gali būti didelis duomenų kiekis, o norint prisijungti prie duomenų bazės ir gauti įrašus, gali prireikti net duomenų bazės ryšio. Tokiu atveju nėra prasmės įkelti duomenų į Užsakymai nuosavybės, kol mums reikės duomenų. Tingus inicijavimas leidžia mums įkelti Užsakymai rinkti tik tada, kai prašoma duomenų.

Lazy klasės naudojimas C #

Nors jūs galite parašyti savo pasirinktinį kodą, kad įgyvendintumėte tingų inicializavimą, „Microsoft“ rekomenduoja naudoti Tingus klasėje. Tingus klasėje Sistema vardų sritis C # buvo pristatyta kaip .Net Framework 4.0 dalis, kad būtų užtikrintas saugus siūlų būdas įgyvendinti tingų inicializavimą. Galite pasinaudoti šia klase ir atidėti daug išteklių reikalaujančių objektų inicijavimą savo programoje.

Kai naudosite Tingus klasę, tipo argumente turite tingiai nurodyti objekto tipą, kurį tingiai norite sukurti. Atminkite, kad tingus inicializavimas įvyksta, kai pasiekiate Tingi. Vertė nuosavybė. Čia yra pavyzdys, kaip Tingus klasė gali būti naudojama:

Tingus užsakymai = naujas tingus();

ISuskaičiuojamas rezultatas = lazyOrders.Value;

Apsvarstykite dvi klases, Autorius ir Tinklaraštis. Autorius gali parašyti daug tinklaraščio įrašų, taigi jūs turite „vienas su daugeliu“ santykį Autorius ir Tinklaraštis klasės, kaip parodyta žemiau esančiame kodo fragmente.

visuomenės klasės Autorius

    {

public int Id {get; rinkinys; }

public string FirstName {get; rinkinys; }

vieša eilutė Pavardė {get; rinkinys; }

viešoji eilutė Adresas {get; rinkinys; }

public List Blogs {get; rinkinys; }

    }

viešosios klasės tinklaraštis

    {

public int Id {get; rinkinys; }

viešoji eilutė Pavadinimas {get; rinkinys; }

public DateTime PublicationDate {get; rinkinys; }

    }

Atkreipkite dėmesį, kad „vienas su daugeliu“ santykis Autorius ir Tinklaraštis klasėms buvo atstovaujama naudojant a Sąrašas nuosavybė (tipo Tinklaraštis) viduje konors Autorius klasė. Naudodamasis šia nuosavybe, Autorius klasėje gali būti surinkta viena ar kelios Tinklaraštis klasė.

Dabar tarkime, kad vartotojo sąsajoje turime rodyti tik išsamią autoriaus informaciją (vardą, pavardę ir adresą). Šiuo atveju nėra prasmės įkelti autoriaus tinklaraščio informacijos; mes norime tingiai įkelti tinklaraščio informaciją. Čia yra atnaujinta Autorius klasės, kuri patenkina šį poreikį. Atkreipkite dėmesį į Tingus klasė.

visuomenės klasės Autorius

    {

public int Id {get; rinkinys; }

public string FirstName {get; rinkinys; }

vieša eilutė Pavardė {get; rinkinys; }

viešoji eilutė Adresas {get; rinkinys; }

viešoji tinginė Dienoraščiai => naujas tingus(() => GetBlogDetailsForAuthor (this.Id));

privatus IList GetBlogDetailsForAuthor (int ID)

        {

// Čia parašykite kodą, kad gautumėte visą autoriaus tinklaraščio informaciją.

        }

    }

Naudojant bendrąją „Lazy“ klasę C #

Dabar pažvelkime, kaip galime pasinaudoti generiniu Tingus klasėje įgyvendinti „Singleton“ dizaino modelį. (Čia galite perskaityti mano straipsnį apie „Singleton“ dizaino modelį.) Ši versija „StateManager“ klasė yra saugi siūlams. Kartu tai rodo tingų inicializavimą. Atminkite, kad aiškus statinis konstruktorius buvo naudojamas siekiant užtikrinti, kad C # kompiliatorius nepažymėtų tipo kaip prieš lauką.

vieša užantspauduota „StateManager“ klasė

    {

privatus „StateManager“ ()

        {

        }

viešasis statinis „StateManager“ egzempliorius

        {

gauti

            {

grąžinti Nested.obj;

            }

        }

privati ​​klasė

        {

statinis įdėtas ()

            {

            }

vidinis statinis tik skaitomas StateManager obj = new StateManager ();

        }

    }

Čia yra tingus programos įgyvendinimas „StateManager“ klasė, kuri naudojasi Tingus klasė. Galite pamatyti, kaip Tingus klasėje labai lengva įgyvendinti tingumą.

viešosios klasės „StateManager“

    {

privatus statinis tik skaitomas tingus obj = naujas tingus (() => naujas StateManager ());

privatus „StateManager“ () {}

viešasis statinis „StateManager“ egzempliorius

        {

gauti

            {

return obj.Value;

            }

        }

    }

Pažvelkite į Instancija nuosavybė „StateManager“ klasė aukščiau. Atkreipkite dėmesį, kad Vertė ypatybė, kurią matote pirmiau pateiktame kodo pavyzdyje, yra tik skaitoma. Dėl šios priežasties nėra nustatyto prieigos teisės.

Tinginio inicijavimas yra puiki našumo optimizavimo technika, leidžianti atidėti objektų, kurie sunaudoja didelius procesoriaus ir atminties išteklius, inicijavimą tol, kol jų jums tikrai prireiks. Pasinaudokite tingiu inicijavimu, kad pagerintumėte savo programų našumą.