Kako izvesti lijenu inicijalizaciju u C #

Lijena inicijalizacija tehnika je koja odgađa stvaranje objekta do prvog potrebe. Drugim riječima, inicijalizacija objekta događa se samo na zahtjev. Imajte na umu da izrazi lijena inicijalizacija i lijena instancija znače isto - mogu se koristiti naizmjenično. Koristeći prednosti lijene inicijalizacije, možete poboljšati performanse aplikacije izbjegavanjem nepotrebnih izračuna i potrošnje memorije. U ovom ćemo članku pogledati kako možemo izvesti lijenu inicijalizaciju u C #.

Razumijemo lijeno učitavanje jednostavnim primjerom. Razmotrimo dvije klase Customeri Order. CustomerKlasa sadrži Ordersimovinu koja je pak referencira zbirku primjeraka Orderklase. OrdersSkup može sadržavati veliku količinu podataka, a može čak i potrebu povezivanja baze podataka za spajanje na bazu podataka i dohvaćanje zapisa. U takvom slučaju nema smisla učitavati podatke u Orderssvojstvo dok nam podaci ne zatrebaju. Lijena inicijalizacija omogućuje nam učitavanje Orderskolekcije samo kada se traže podaci.

Korištenje klase Lazy u C #

Iako možete napisati vlastiti prilagođeni kôd za provedbu lijene inicijalizacije, Microsoft preporučuje upotrebu Lazyklase umjesto toga. LazyKlasa u Systemimenski prostor u C # je uvedena kao dio NET Framework 4.0 pružiti nit-siguran način za provedbu lijeni inicijalizaciju. Možete iskoristiti ovu klasu za odgodu inicijalizacije objekata koji zahtijevaju resurse u vašoj aplikaciji.

Kada koristite Lazyklasu, u argumentu tipa morate navesti vrstu objekta koji namjeravate lijeno stvoriti. Imajte na umu da se lijena inicijalizacija događa kada pristupite Lazy.Valuesvojstvu. Evo primjera kako se Lazyklasa može koristiti:

Lijen
   
     narudžbe = novi Lijen
    
     ();
     

IEnumerable rezultat = lazyOrders.Value;

Sada, razmotrite dvije klase Authori Blog. Autor može pisati mnogo blogu, tako da imate jedan-na-više odnos između Authorte Blogklase kao što je prikazano u isječku koda u nastavku.

javni razred Autor

    {

        javni int Id {get; postavljen; }

        javni niz FirstName {get; postavljen; }

        javni niz LastName {get; postavljen; }

        javni niz Adresa {get; postavljen; }

        javni popis blogova {get; postavljen; }

    }

    javni razred Blog

    {

        javni int Id {get; postavljen; }

        javni niz Naslov {get; postavljen; }

        javni DateTime PublicationDate {get; postavljen; }

    }

Imajte na umu da je jedan-prema-više odnos između Authorte Blogklase je zastupljena pomoću Listnekretnina (tipa Blog) u Authorklasi. Koristeći ovo svojstvo, Authorklasa može sadržavati kolekciju jednog ili više primjeraka Blogklase.

Sad pretpostavimo da u korisničkom sučelju trebamo prikazati samo detalje o autoru (ime, prezime i adresa). U ovom slučaju nema smisla učitavati detalje bloga za autora; želimo lijeno učitati detalje bloga. Evo ažurirane Authorklase koja se bavi tom potrebom. Primijetite upotrebu Lazyklase.

javni razred Autor

    {

        javni int Id {get; postavljen; }

        javni niz FirstName {get; postavljen; }

        javni niz LastName {get; postavljen; }

        javni niz Adresa {get; postavljen; }

        javni Lijeni Blogovi => novi Lijeni (() => GetBlogDetailsForAuthor (this.Id));

        privatni IList GetBlogDetailsForAuthor (int Id)

        {

       // Ovdje napišite kod za pronalaženje svih pojedinosti bloga za autora.

        }

    }

Korištenje generičke klase Lazy u C #

Pogledajmo sada kako možemo iskoristiti generičku Lazyklasu za provedbu uzorka dizajna Singleton. (Ovdje možete pročitati moj članak o uzorku dizajna Singleton.) Sljedeća verzija StateManagerklase zaštićena je nitima. Istodobno, pokazuje lijenu inicijalizaciju. Imajte na umu da je eksplicitni statički konstruktor korišten kako bi se osiguralo da C # kompajler ne označi tip kao beforefieldinit.

javno zapečaćena klasa StateManager

    {

        private StateManager ()

        {

        }

        javna statička instanca StateManager

        {

            dobiti

            {

                povratak Nested.obj;

            }

        }

        privatna klasa Ugniježđena

        {

            statično ugniježđeno ()

            {

            }

            interni statički samo za čitanje StateManager obj = new StateManager ();

        }

    }

Evo lijene implementacije StateManagerklase koja koristi Lazyklasu. Možete vidjeti kako Lazyrazred olakšava provođenje lijenosti. 

javni razred StateManager

    {

        privatni statički samo za čitanje Lazy obj = new Lazy (() => new StateManager ());

        private StateManager () {}

        javna statička instanca StateManager

        {

            dobiti

            {

                povratak obj.Vrijednost;

            }

        }

    }

Pogledajte Instancesvojstvo u StateManagerrazredu iznad. Imajte na umu da je Valuesvojstvo koje vidite u gornjem primjeru koda samo za čitanje. Iz tog razloga ne postoji postavljeni dodatak.

Lijena inicijalizacija izvrsna je tehnika optimizacije izvedbe koja vam omogućuje odgodu inicijalizacije objekata koji troše značajne CPU i memorijske resurse dok vam apsolutno nisu potrebni. Iskoristite lijenu inicijalizaciju da biste poboljšali izvedbu svojih aplikacija.