Leniwa inicjalizacja obiektów – klasa Lazy

2012-04-21 

W .NET 4 pojawiła się nowa klasa System.Lazy<T>. Opakowuje ona obiekt danego typu, dzięki czemu jego inicjalizacja następuje dopiero w momencie pierwszego użycia. Jeżeli nie odwołamy się do obiektu opakowanego klasą Lazy pozostanie on niezainicjalizowany.  Ma to zastosowanie w przypadku obiektów, których utworzenie wymaga zwiększonego zapotrzebowania na zasoby, zwłaszcza gdy może wystąpić sytuacja, iż obiekt ten nie zostanie użyty. Klasa Lazy posiada dwie właściwości:

  • IsValueCreated – informacja czy opakowany obiekt został utworzony
  • Value – odwołanie do opakowanego obiektu (typ <T>)

Przykład 1:

//Opakowanie obiektu typu string
//Argumentem konstruktora klasy Lazy jest funkcja inicjalizująca obiekt
Lazy<string> MyLazyString = new Lazy<string>(() => "Lazy test");

//Sprawdzenie czy obiekt został utworzony, wynik: FALSE
MessageBox.Show(MyLazyString.IsValueCreated.ToString());

//Odwołanie do obiektu
this.Text = MyLazyString.Value;

//Ponowne sprawdzenie czy obiekt został utworzony, wynik: TRUE
MessageBox.Show(MyLazyString.IsValueCreated.ToString());

Przykład 2:

//Opakowanie obiektu typu Label
Lazy<Label> MyLazyLabel = new Lazy<Label>(() =>
    {
        Label MyLabel = new Label();
        MyLabel.Parent = this;
        MyLabel.Text = "Lazy test";
        MyLabel.Top = 50;
        MyLabel.Left = 50;
        MyLabel.Visible = false;
        return MyLabel;
    }
);

//Sprawdzenie czy obiekt został utworzony, wynik: FALSE
MessageBox.Show(MyLazyLabel.IsValueCreated.ToString());

//Odwołanie do obiektu (zmiana właściwości Visible)
MyLazyLabel.Value.Visible = true;

//Ponowne sprawdzenie czy obiekt został utworzony, wynik: TRUE
MessageBox.Show(MyLazyLabel.IsValueCreated.ToString());

Przykład 3:

//Metoda tworząca obiekt Label
private Label CreateMyLabel()
{
    Label MyLabel = new Label();
    MyLabel.Parent = this;
    MyLabel.Text = "Lazy test";
    MyLabel.Top = 50;
    MyLabel.Left = 50;
    MyLabel.Visible = true;
    return MyLabel;
}

//Opakowanie obiektu typu Label z wykorzystaniem powyższej metody
Lazy<Label> MyLazyLabel = new Lazy<Label>(() => CreateMyLabel());

//Sprawdzenie czy obiekt został utworzony, wynik: FALSE
//Mimo ustawienia Visible na true, obiekt będzie widoczny dopiero po pierwszym odwołaniu do niego, wtedy nastąpi inicjalizacja
MessageBox.Show(MyLazyLabel.IsValueCreated.ToString());

//Odwołanie do obiektu (zmiana właściwości Top)
MyLazyLabel.Value.Top = 100;

//Ponowne sprawdzenie czy obiekt został utworzony, wynik: TRUE, obiekt jest widoczny
MessageBox.Show(MyLazyLabel.IsValueCreated.ToString());

Więcej informacji o klasie Lazy: MSDN 

Reklamy

Posted on 2012-04-21, in .NET/C# and tagged , , . Bookmark the permalink. 1 komentarz.

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Wyloguj / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Wyloguj / Zmień )

Zdjęcie na Facebooku

Komentujesz korzystając z konta Facebook. Wyloguj / Zmień )

Zdjęcie na Google+

Komentujesz korzystając z konta Google+. Wyloguj / Zmień )

Connecting to %s

%d blogerów lubi to: