Laiska alustus on tekniikka, joka lykkää objektin luomista ensimmäistä kertaa. Toisin sanoen objektin alustaminen tapahtuu vain pyynnöstä. Huomaa, että termit laiska alustus ja laiska välitön käyttö tarkoittavat samaa - niitä voidaan käyttää keskenään. Hyödyntämällä laiskaa alustusta voit parantaa sovelluksen suorituskykyä välttämällä tarpeetonta laskentaa ja muistin kulutusta. Tässä artikkelissa tarkastellaan, miten voimme suorittaa laiskan alustuksen C #: ssä.
Ymmärretään laiska lataus yksinkertaisella esimerkillä. Harkitse kahta luokkaa, Asiakas
ja Tilaus
. Asiakas
luokka sisältää Tilaukset
ominaisuus, joka puolestaan viittaa kokoelmaan Tilaus
luokassa. Tilaukset
kokoelma voi sisältää suuren määrän tietoa ja saattaa tarvita jopa tietokantayhteyden yhteyden muodostamiseksi tietokantaan ja tietueiden hakemiseen. Tällöin ei ole mitään syytä ladata tietoja Tilaukset
omaisuutta, kunnes tarvitsemme tietoja. Laiska alustus antaa meille mahdollisuuden ladata Tilaukset
kerätä vain, kun tietoja pyydetään.
Lazy-luokan käyttäminen C #: ssä
Vaikka voit kirjoittaa oman mukautetun koodin laiskan alustuksen toteuttamiseksi, Microsoft suosittelee Laiska
luokan sijaan. Laiska
luokka Järjestelmä
nimitila C #: ssä otettiin käyttöön osana .Net Framework 4.0: ta tarjoamaan langankestävä tapa toteuttaa laiska alustus. Voit hyödyntää tätä luokkaa lykätäksesi resurssiintensiivisten objektien alustamista sovelluksessasi.
Kun käytät Laiska
luokassa, sinun on määritettävä tyypin objekti, jonka aiot luoda laiskasti tyyppi-argumentissa. Huomaa, että laiska alustus tapahtuu, kun avaat Laiska. Arvo
omaisuus. Tässä on esimerkki siitä, miten Laiska
luokkaa voidaan käyttää:
Laiskatilaukset = uusi Laiska (); ILukematon tulos = lazyOrders.Value;
Harkitse nyt kahta luokkaa, Kirjoittaja
ja Blogi
. Kirjoittaja voi kirjoittaa useita blogiviestejä, joten sinulla on yksi-moniin-suhde Kirjoittaja
ja Blogi
luokat alla olevan koodikatkelman mukaisesti.
public class Kirjoittaja{
julkinen int Id {get; aseta; }
julkinen merkkijono Etunimi {get; aseta; }
julkinen merkkijono Sukunimi {get; aseta; }
julkinen merkkijono Osoite {get; aseta; }
public List Blogs {get; aseta; }
}
julkisen luokan blogi
{
julkinen int Id {get; aseta; }
julkinen merkkijono Otsikko {get; aseta; }
public DateTime PublicationDate {get; aseta; }
}
Huomaa, että Kirjoittaja
ja Blogi
luokkiin on esitetty a Lista
ominaisuus (tyyppi Blogi
) Kirjoittaja
luokassa. Tämän ominaisuuden avulla Kirjoittaja
luokassa voi olla kokoelma yhdestä tai useammasta Blogi
luokassa.
Oletetaan, että meidän on näytettävä käyttöliittymässä vain tekijän tiedot (etunimi, sukunimi ja osoite). Tässä tapauksessa ei ole mitään syytä ladata blogin tietoja kirjoittajalle. haluamme ladata blogin yksityiskohdat laiskasti. Tässä on päivitetty Kirjoittaja
luokka, joka vastaa tähän tarpeeseen. Huomaa Laiska
luokassa.
public class Kirjoittaja{
julkinen int Id {get; aseta; }
julkinen merkkijono Etunimi {get; aseta; }
julkinen merkkijono Sukunimi {get; aseta; }
julkinen merkkijono Osoite {get; aseta; }
julkinen Laiska
Blogit => uusi Laiska (() => GetBlogDetailsForAuthor (this.Id)); yksityinen IList GetBlogDetailsForAuthor (int Id)
{
// Kirjoita koodi tähän saadaksesi kaikki kirjoittajan blogitiedot.
}
}
Lazy-luokan käyttäminen C #: ssä
Katsotaan nyt, kuinka voimme hyödyntää yleistä Laiska
luokassa toteuttamaan Singletonin suunnittelumalli. (Voit lukea artikkelini Singletonin suunnittelumallista täältä.) Seuraava versio StateManager
luokka on langankestävä. Samalla se osoittaa laiska alustus. Huomaa, että nimenomaista staattista konstruktoria on käytetty sen varmistamiseksi, että C # -kääntäjä ei merkitse tyyppiä nimellä ennen kenttää
.
julkinen sinetöity luokan StateManager{
yksityinen StateManager ()
{
}
julkinen staattinen StateManager-instanssi
{
saada
{
paluu Nested.obj;
}
}
yksityisluokka Sisäkkäin
{
staattinen sisäkkäin ()
{
}
sisäinen staattinen luettavissa vain StateManager obj = new StateManager ();
}
}
Tässä on laiska toteutus StateManager
luokka, joka hyödyntää Laiska
luokassa. Näet kuinka Laiska
luokan ansiosta laiskuuden toteuttaminen on todella helppoa.
julkisen luokan StateManager{
staattinen staattinen luettavissa Lazy obj = new Lazy (() => new StateManager ());
yksityinen StateManager () {}
julkinen staattinen StateManager-instanssi
{
saada
{
return obj.arvo;
}
}
}
Katsokaa Ilmentymä
kiinteistö StateManager
luokka edellä. Huomaa, että Arvo
Yllä olevassa koodiesimerkissä näkyvä ominaisuus on vain luku -tilassa. Tästä syystä ei ole määritettyä käyttöoikeutta.
Laiska-alustus on erinomainen suorituskyvyn optimointitekniikka, jonka avulla voit lykätä huomattavasti suoritin- ja muistiresursseja kuluttavien objektien alustamista, kunnes tarvitset niitä ehdottomasti. Paranna sovellusten suorituskykyä hyödyntämällä laiska alustus.