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:
Tingusuž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ą.