Líná inicializace je technika, která brání vytvoření objektu, dokud není potřeba poprvé. Jinými slovy, inicializace objektu probíhá pouze na vyžádání. Všimněte si, že výrazy líná inicializace a líná konkretizace znamenají totéž - lze je používat zaměnitelně. Využitím líné inicializace můžete zlepšit výkon aplikace tím, že se vyhnete zbytečným výpočtům a spotřebě paměti. V tomto článku se podíváme na to, jak můžeme provést línou inicializaci v C #.
Pojďme pochopit líné načítání na jednoduchém příkladu. Zvažte dvě třídy, Zákazník
a Objednat
. The Zákazník
třída obsahuje Objednávky
vlastnost, která zase odkazuje na kolekci instancí Objednat
třída. The Objednávky
kolekce může obsahovat velké množství dat a může dokonce vyžadovat připojení k databázi pro připojení k databázi a načítání záznamů. V takovém případě nemá smysl načítat data do souboru Objednávky
dokud nebudeme potřebovat data. Líná inicializace nám umožňuje načíst Objednávky
sběr dat pouze v případě, že jsou data požadována.
Používání třídy Lazy v C #
I když můžete k implementaci líné inicializace napsat vlastní kód, Microsoft doporučuje použít Líný
třídy místo. The Líný
třída v Systém
jmenný prostor v C # byl představen jako součást .Net Framework 4.0, aby poskytoval bezpečný způsob implementace líné inicializace. Tuto třídu můžete využít k odložení inicializace objektů náročných na prostředky ve vaší aplikaci.
Když používáte Líný
třídy, musíte v argumentu typu líně určit typ objektu, který chcete vytvořit. Všimněte si, že líná inicializace nastane, když vstoupíte do Líný. Hodnota
vlastnictví. Zde je příklad toho, jak Líný
lze použít třídu:
Línýobjednávky = novinka Lazy (); IEnumerable result = lazyOrders.Value;
Nyní zvažte dvě třídy, Autor
a Blog
. Autor může psát mnoho blogových příspěvků, takže mezi nimi máte vztah jedna k mnoha Autor
a Blog
třídy, jak je uvedeno v úryvku kódu níže.
veřejná třída Autor{
public int Id {get; soubor; }
public string FirstName {get; soubor; }
veřejný řetězec Příjmení {get; soubor; }
public string Adresa {get; soubor; }
public List Blogs {get; soubor; }
}
veřejná třída Blog
{
public int Id {get; soubor; }
public string Název {get; soubor; }
public DateTime PublicationDate {get; soubor; }
}
Všimněte si, že vztah one-to-many mezi Autor
a Blog
tříd byla zastoupena pomocí a Seznam
vlastnost (typu Blog
) v Autor
třída. Pomocí této vlastnosti se Autor
třída může obsahovat kolekci jedné nebo více instancí Blog
třída.
Nyní předpokládejme, že v uživatelském rozhraní musíme zobrazit pouze podrobnosti o autorovi (jméno, příjmení a adresa). V tomto případě nemá smysl načítat podrobnosti blogu pro autora; chceme líně načíst podrobnosti blogu. Zde je aktualizovaný Autor
třída, která tuto potřebu řeší. Všimněte si použití Líný
třída.
veřejná třída Autor{
public int Id {get; soubor; }
public string FirstName {get; soubor; }
veřejný řetězec Příjmení {get; soubor; }
public string Adresa {get; soubor; }
veřejné líné
Blogy => novinka Lazy (() => GetBlogDetailsForAuthor (this.Id)); soukromý IList GetBlogDetailsForAuthor (int ID)
{
// Sem napište kód a načtěte všechny podrobnosti blogu pro autora.
}
}
Používání obecné třídy Lazy v C #
Pojďme se nyní podívat na to, jak můžeme využít generikum Líný
třídy k implementaci návrhového vzoru Singleton. (Můj článek o návrhovém vzoru Singleton si můžete přečíst zde.) Následující verze StateManager
třída je bezpečná pro vlákna. Zároveň ukazuje línou inicializaci. Všimněte si, že explicitní statický konstruktor byl použit k zajištění, že kompilátor C # neoznačí typ jako beforefieldinit
.
veřejná zapečetěná třída StateManager{
private StateManager ()
{
}
veřejná statická instance StateManager
{
dostat
{
návrat Nested.obj;
}
}
soukromá třída vnořená
{
statické vnořené ()
{
}
interní statické čtení pouze StateManager obj = new StateManager ();
}
}
Zde je líná implementace StateManager
třída, která využívá Líný
třída. Můžete vidět, jak Líný
díky třídě je implementace lenosti opravdu jednoduchá.
veřejná třída StateManager{
private static readonly Lazy obj = new Lazy (() => new StateManager ());
private StateManager () {}
veřejná statická instance StateManager
{
dostat
{
návratová obj. hodnota;
}
}
}
Podívejte se na Instance
nemovitost v StateManager
třída výše. Všimněte si, že Hodnota
vlastnost, kterou vidíte ve výše uvedeném příkladu kódu, je jen pro čtení. Z tohoto důvodu neexistuje žádný přístupový soubor.
Líná inicializace je vynikající technikou optimalizace výkonu, která vám umožní odložit inicializaci objektů, které spotřebovávají značné prostředky CPU a paměti, dokud je absolutně nepotřebujete. Využijte línou inicializaci a vylepšete výkon svých aplikací.