.Net 4.0: Lazy<T>

23.05.2009  |  Gunnar

Keeruline jutt Hiljutises kandes Visual Studio 2010 teemadel lubasin kirjutada System nimeruumi uuest klassist, millel nimeks Lazy<T>. Tegemist on klassiga, mida saab kasutada rakendustes, kus lazy loading on oluline.

Esiteks lihtne, quick’n’dirty koodinäide. Tegemist on äärmiselt primitiivse koodirakendusega, mis illustreerib Lazy<T> klassi toimimist.

static void Main(string[] args)
{
    var lazyString = new Lazy<string>(
        () =>
        {
            // Here you can do some complex processing
            // and then return a value.
     Console.Write("Inside lazy loader");
            return "Lazy loading!";
        });
    Console.Write("Is value created: ");
    Console.WriteLine(lazyString.IsValueCreated);
 
    Console.Write("Value: ");
    Console.WriteLine(lazyString.Value);

    Console.Write("Value again: ");
    Console.WriteLine(lazyString.Value);

    Console.Write("Is value created: ");
    Console.WriteLine(lazyString.IsValueCreated);
 
    Console.WriteLine("Press any key to continue ...");
    Console.ReadLine();
}

Rakenduse käivitamisel saame järgneva väljundi:

    Is value created: False
    Inside lazy loader
    Value: Lazy loading!
    Value again: Lazy loading!
    Is value created: True
    Press any key to continue …

Esimesel korral kui väärtust küsime, lastakse käima funktsioon, mis väärtuse tagastab. Funktsiooni kutsumisel kirjutatakse ekraanile väljundi teine rida. Teisel väärtuse küsimisel kasutatakse juba väärtust, mille funktsioon meile esimesel kutsel tagastas ja seega väljundi teist rida me uuesti ei näe.

Selge on see, et avalike liideste korral me Lazy<T> klassi tagastatava väärtusena kasutama ei hakka ja selleks pole ka vajadust. Tegemist on konstruktsiooniga, mida kasutame klasside sees nähtamatult klasside klientidele.

Põhjalikumat lugemist Lazy<T> klassi ja selle sees toimuva kohta pakub MSDN-i artikkel Lazy Computation in C#.

4 kommentaari sissekandele “.Net 4.0: Lazy<T>”

  1. Bunter

    Tundub see ainult mulle, või on see üks kõige triviaalsemaid lisandeid mida SUURTE ASJADE nimekirjas välja hüütakse?

  2. Gunnar

    See on vaiks üks pudinatest, mis uus. On muidki asju, millest ma kirjutada kavatsen. Selle jubin oli lihtsalt üks esimesi, millest alustasin.

  3. Bunter

    Ära võta isiklikult, ma pidasin Microsofti enda nimekirja silmas :) Mõjub kuidagi kentsakalt seal see F# ja paraleeltöötluse lisade vahel. Umbes, et töötasime välja täisautomatiseeritud piimakombinaadi roboti ja ahjaa, lehmadele on nüüdsest ka pikema varrega hari saadaval.

  4. Gunnar

    :D

    Ei võta isiklikult. Samas ma selle Lazy avastamise hetkel arvasin, et sellest kuuleb seal päris palju uute vidinate juures, kuid võta näpust.

Kommenteeri

sulge
Saada link e-postiga

© DT 2012 | Creative Commons Attribution-Noncommercial 3.0 License | WordPress