Inițializare întârziată și tipul Lazy
O aplicație poate folosi numeroase clase și obiecte. Totuși, există posibilitatea ca nu toate obiectele create să fie utilizate, mai ales în cazul aplicațiilor mari. De exemplu:
class Reader
{
Library library = new Library();
public void ReadBook()
{
library.GetBook();
Console.WriteLine("Citim o carte tipărită");
}
public void ReadEbook()
{
Console.WriteLine("Citim o carte pe computer");
}
}
class Library
{
private string[] books = new string[99];
public void GetBook()
{
Console.WriteLine("Dăm o carte cititorului");
}
}
Există o clasă Library, care reprezintă o bibliotecă și stochează un anumit set de cărți sub formă de matrice. Există și o clasă Reader, care stochează o referință la un obiect de tip bibliotecă, în care este înregistrat.
Cititorul are definite două metode: una pentru citirea unei cărți electronice și alta pentru citirea unei cărți obișnuite. Pentru a citi o carte obișnuită, este necesar să apelăm metoda clasei Library pentru a obține acea carte.
Dar ce se întâmplă dacă cititorul nu va trebui să citească deloc o carte obișnuită, ci doar cărți electronice, de exemplu, în următorul caz:
Reader reader = new Reader();
reader.ReadEbook();
În acest caz, obiectul library din clasa cititor nu va fi folosit deloc și va ocupa doar spațiu în memorie, deși nu este necesar.
Pentru astfel de cazuri în .NET este definită clasa specială Lazy<T>. Să modificăm clasa cititor astfel:
class Reader
{
Lazy<Library> library = new Lazy<Library>();
public void ReadBook()
{
library.Value.GetBook();
Console.WriteLine("Citim o carte tipărită");
}
public void ReadEbook()
{
Console.WriteLine("Citim o carte pe computer");
}
}
Clasa Library rămâne neschimbată. Dar acum clasa Reader conține o referință la bibliotecă sub forma unui obiect Lazy<Library>. Iar pentru a accesa biblioteca și metodele acesteia, trebuie să folosim expresia library.Value - aceasta este obiectul Library.
Ce schimbă în comportamentul clasei Reader această modificare? Să analizăm utilizarea ei:
Reader reader = new Reader();
reader.ReadEbook();
reader.ReadBook();
Obiectul Library este folosit direct doar la a treia linie, în metoda reader.ReadBook(), care la rândul său apelează metoda library.Value.GetBook(). Prin urmare, până la a treia linie, obiectul Library utilizat de cititor nu va fi creat.
Dacă nu vom folosi metoda reader.ReadBook() în program, atunci obiectul bibliotecii nu va fi creat deloc, evitând astfel costurile suplimentare de memorie. Astfel, Lazy<T> ne garantează că obiectul va fi creat doar atunci când este necesar.