Slinkā inicializācija ir paņēmiens, kas atliek objekta izveidi līdz pirmajai nepieciešamībai. Citiem vārdiem sakot, objekta inicializēšana notiek tikai pēc pieprasījuma. Ņemiet vērā, ka termini slinks inicializācija un slinks tūlītējs raksturs nozīmē vienu un to pašu - tos var izmantot kā aizstājamus. Izmantojot slinkās inicializācijas priekšrocības, varat uzlabot lietojumprogrammas veiktspēju, izvairoties no nevajadzīgas aprēķināšanas un atmiņas patēriņa. Šajā rakstā mēs apskatīsim, kā mēs varam veikt slinku inicializāciju C #.
Sapratīsim slinku iekraušanu ar vienkāršu piemēru. Apsveriet divas klases, Klients
un Pasūtījums
. The Klients
klasē ir Pasūtījumi
rekvizīts, kas savukārt atsaucas uz Pasūtījums
klasē. The Pasūtījumi
kolekcijā var būt liels datu apjoms, un, lai izveidotu savienojumu ar datu bāzi un izgūtu ierakstus, var būt nepieciešams savienojums ar datu bāzi. Šādā gadījumā nav jēgas ielādēt datus programmā Pasūtījumi
līdz mums būs nepieciešami dati. Slinkā inicializācija ļauj mums ielādēt Pasūtījumi
vākšanu tikai tad, kad tiek pieprasīti dati.
Lazy klases izmantošana C #
Lai gan jūs varat rakstīt savu pielāgoto kodu, lai ieviestu slinko inicializāciju, Microsoft iesaka izmantot Slinki
klases vietā. The Slinki
klase Sistēma
nosaukumvieta C # tika ieviesta kā daļa no .Net Framework 4.0, lai nodrošinātu pavedieniem drošu veidu, kā īstenot slinku inicializāciju. Varat izmantot šīs klases priekšrocības, lai atliktu resursu ietilpīgu objektu inicializēšanu lietojumprogrammā.
Kad izmantojat Slinki
klasē, tipa argumentā jums jānorāda objekta tips, kuru plānojat izveidot slinki. Ņemiet vērā, ka slinka inicializēšana notiek, kad piekļūstat Slinks. Vērtība
īpašums. Šeit ir piemērs tam, kā Slinki
klasi var izmantot:
Slinkipasūtījumi = jauns Slinks (); ISkaitāms rezultāts = lazyOrders.Value;
Apsveriet divas klases, Autors
un Emuārs
. Autors var rakstīt daudzus emuāra ierakstus, tāpēc jums ir saikne viens pret daudziem Autors
un Emuārs
klases, kā parādīts zemāk esošajā koda fragmentā.
sabiedrības klase Autors{
public int Id {get; komplekts; }
publiskā virkne FirstName {get; komplekts; }
publiskā virkne Uzvārds {get; komplekts; }
publiska virkne Adrese {get; komplekts; }
public List Blogs {get; komplekts; }
}
sabiedrības klases emuārs
{
public int Id {get; komplekts; }
public string Nosaukums {get; komplekts; }
public DateTime PublicationDate {get; komplekts; }
}
Ņemiet vērā, ka savstarpējās attiecības starp Autors
un Emuārs
klases ir pārstāvētas, izmantojot a Saraksts
īpašums (tipa Emuārs
) iekš Autors
klasē. Izmantojot šo rekvizītu, Autors
klase var glabāt viena vai vairāku Emuārs
klasē.
Tagad pieņemsim, ka lietotāja saskarnē mums jāparāda tikai autora informācija (vārds, uzvārds un adrese). Šajā gadījumā nav jēgas ielādēt autora emuāra informāciju; mēs gribam slinki ielādēt emuāra detaļas. Šeit ir atjaunināts Autors
klase, kas risina šo vajadzību. Ievērojiet Slinki
klasē.
sabiedrības klase Autors{
public int Id {get; komplekts; }
publiskā virkne FirstName {get; komplekts; }
publiskā virkne Uzvārds {get; komplekts; }
publiska virkne Adrese {get; komplekts; }
publika Slinks
Emuāri => jauns slinks (() => GetBlogDetailsForAuthor (this.Id)); privāts IList GetBlogDetailsForAuthor (int Id)
{
// Uzrakstiet kodu šeit, lai izgūtu visu autora emuāra informāciju.
}
}
Izmantojot vispārīgo Lazy klasi C #
Apskatīsim, kā mēs varam izmantot vispārīgo Slinki
klasē, lai ieviestu Singleton dizaina modeli. (Šeit varat izlasīt manu rakstu par Singleton dizaina modeli.) Šī StateManager
klase ir droša ar vītnēm. Tajā pašā laikā tas parāda slinku inicializāciju. Ņemiet vērā, ka tiešais statiskais konstruktors ir izmantots, lai nodrošinātu, ka C # kompilators neatzīmē veidu kā pirms lauka
.
publiski aizzīmogota klases StateManager{
privāts StateManager ()
{
}
publiskā statiskā StateManager instance
{
gūt
{
atgriešanās Nested.obj;
}
}
privāta klase Ligzdota
{
statisks ligzdots ()
{
}
iekšējais statiskais tikai lasāms StateManager obj = new StateManager ();
}
}
Šeit ir slinks programmas ieviešana StateManager
klase, kas izmanto Slinki
klasē. Jūs varat redzēt, kā Slinki
klase padara slinkumu īstenošanu patiešām vienkāršu.
publiskās klases StateManager{
privāts statisks tikai lasāms Lazy obj = new Lazy (() => new StateManager ());
privāts StateManager () {}
publiskā statiskā StateManager instance
{
gūt
{
return obj.Value;
}
}
}
Apskatiet Instance
īpašums StateManager
klases augstāk. Ņemiet vērā, ka Vērtība
Īpašums, kuru redzat iepriekš minētajā koda piemērā, ir tikai lasāms. Šī iemesla dēļ nav noteikta piekļuves.
Slinkā inicializācija ir lieliska veiktspējas optimizācijas tehnika, kas ļauj atlikt tādu objektu inicializēšanu, kas patērē ievērojamus procesora un atmiņas resursus, līdz tie jums absolūti nepieciešami. Izmantojiet slinkās inicializācijas priekšrocības, lai uzlabotu savu lietotņu veiktspēju.