2011-06-21 12 views
19

Co to jest leniwy inicjalizacji. Oto kod, który otrzymałem po szukaniu google.Lazy inicjalizacji w .NET 4

class MessageClass 
{ 
    public string Message { get; set; } 

    public MessageClass(string message) 
    { 
     this.Message = message; 
     Console.WriteLine(" *** MessageClass constructed [{0}]", message); 
    } 
} 

Lazy<MessageClass> someInstance = new Lazy<MessageClass>(
    () => new MessageClass("The message") 
    ); 

dlaczego powinienem tworzyć obiekt w ten sposób ... kiedy faktycznie musimy stworzyć obiekt w ten sposób ...... szukając odpowiedzi.

Odpowiedz

48

Celem funkcji w .NET 4.0 Lazy ma zastąpić wzór wielu deweloperów używane wcześniej z właściwościami. „Stary” sposób byłoby coś

private MyClass _myProperty; 

public MyClass MyProperty 
{ 
    get 
    { 
     if (_myProperty == null) 
     { 
      _myProperty = new MyClass(); 
     } 
     return _myProperty; 
    } 
} 

ten sposób _myProperty tylko dostaje instancja raz i tylko gdy jest to potrzebne. Jeśli nigdy nie jest potrzebny, nigdy nie jest tworzony. Aby zrobić to samo z Lazy, można napisać

private Lazy<MyClass> _myProperty = new Lazy<MyClass>(() => new MyClass()); 

public MyClass MyProperty 
{ 
    get 
    { 
     return _myProperty.Value; 
    } 
} 

Oczywiście, nie jesteś ograniczony do robienia rzeczy w ten sposób z Lazy, ale celem jest określenie, w jaki sposób do wystąpienia wartość bez faktycznie robi tak aż do niej jest potrzebne. Kod wywołujący nie musi śledzić, czy wartość została utworzona; raczej kod wywołujący po prostu używa właściwości Value. (Jest to możliwe, aby dowiedzieć się, czy wartość została instancja z właściwością IsValueCreated.)

+0

gdy myProperty nieruchomość będzie się nazywać ... jeśli się następujący wiersz wykonać prywatną Lazy _myProperty = new Lazy (() => nowa MyClass()); jak będzie się nazywać własność ..... po prostu nie rozumiem, ponieważ musimy wywoływać własność zawsze jawnie. – Mou

+0

@ user728750 Nie jestem pewien, czy rozumiem, o co prosisz. '_myProperty' to po prostu prywatna zmienna instancji. Możesz również zainicjować go w konstruktorze klasy zawierającej (co może być lepszą praktyką, faktycznie). Użycie tej właściwości jest nieco opcjonalne, ale usuwa streszczenie ".Value", które w przeciwnym razie byłoby potrzebne. – Andrew

+0

Zabawne, że to samo można osiągnąć w Scali tylko za pomocą 'lazy val MyProperty = new MyClass()'. Szkoda, że ​​nigdy nie dostali się do wydania kompilatora Scala dla .Net. – sparebytes

6

Wyjazd dokumentacji MSDN tutaj: Lazy Initialization

leniwe inicjowanie obiektu oznacza, że ​​jego stworzenie jest odroczone do momentu pierwszego użycia. Lazy inicjalizacja służy przede wszystkim do zwiększenia wydajności, uniknięcia marnotrawstwa obliczeń i zmniejszenia wymagań pamięci programu.

8

„leniwe inicjowanie odbywa się po raz pierwszy obiekt Lazy.Value jest dostępne ani metoda Lazy.ToString jest tzw.

pomocą wystąpienie leń się opóźnić tworzenie dużej lub zasobochłonnych przedmiotu albo wykonanie zadania wymagającego dużej ilości zasobów, szczególnie gdy takie tworzenie lub wykonywanie może nie nastąpić w trakcie trwania programu. "

http://msdn.microsoft.com/en-us/library/dd642331.aspx