2011-06-21 19 views
19

¿Qué es la inicialización lenta? aquí está el código que obtuve después de la búsqueda de google.Inicialización lenta en .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") 
    ); 

por qué debería crear un objeto de esta manera ... cuando en realidad necesitamos crear un objeto de esta manera ...... buscando una respuesta.

Respuesta

48

El propósito de la característica Lazy en .NET 4.0 es reemplazar un patrón de muchos desarrolladores utilizados previamente con propiedades. La "vieja" sería algo así como

private MyClass _myProperty; 

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

De esta manera, se crea una instancia _myProperty solamente una vez y sólo cuando es necesario. Si nunca es necesario, nunca se crea una instancia. Para hacer lo mismo con Lazy, puede escribir

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

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

Por supuesto, no se limitan a hacer las cosas de esta manera con Lazy, pero el propósito es especificar cómo crear una instancia de un valor sin llegar a hacerlo hasta que se es necesario. El código de llamada no tiene que hacer un seguimiento de si el valor ha sido instanciado; más bien, el código de llamada solo usa la propiedad Value. (Es posible averiguar si el valor ha creado una instancia con la propiedad IsValueCreated.)

+0

cuando MyProperty la propiedad se llama ... si la siguiente línea ejecutar privada Lazy _myProperty = new Lazy (() => nueva MyClass()); cómo se llamará la propiedad ..... simplemente no entiendo porque tenemos que llamar a la propiedad siempre explícitamente. – Mou

+0

@ user728750 No estoy muy seguro de entender lo que estás preguntando. '_myProperty' es solo una variable de instancia privada. También podría inicializarlo en el constructor de la clase contenedora (lo que en realidad podría ser una mejor práctica). El uso de la propiedad es algo opcional, pero abstrae la llamada '.Value' que de otro modo sería necesaria. – Andrew

+0

Es curioso que lo mismo se puede lograr en Scala con solo 'lazy val MyProperty = new MyClass()'. Lástima que nunca consiguieron publicar un compilador de Scala para .Net. – sparebytes

6

Salida documentación de MSDN aquí: Lazy Initialization

inicialización perezosa de un objeto significa que su creación se difiere hasta que se utilizó por primera vez. La inicialización diferida se usa principalmente para mejorar el rendimiento, evitar cálculos innecesarios y reducir los requisitos de memoria del programa.

8

"inicialización Lazy ocurre la primera vez que se accede a la propiedad Lazy.Value o el método Lazy.ToString se llama.

utilizar una instancia de Lazy aplazar la creación de un objeto grande o intensivo de los recursos o la la ejecución de una tarea de uso intensivo de recursos, particularmente cuando tal creación o ejecución podría no ocurrir durante la vida del programa ".

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