Programování

Jak provést línou inicializaci v C #

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í.