2011-06-21 142 views
19

什么是延迟初始化。这里是我搜索谷歌后的代码。.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") 
    ); 

为什么要用这种方式创建对象......当我们实际上需要用这种方式创建对象......寻找答案时。

回答

48

在.NET 4.0的Lazy功能的目的是,以取代属性先前使用的图案许多开发。 “旧”的方式会是这样的

private MyClass _myProperty; 

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

这样,_myProperty只得到实例化一次,并且只在需要时。如果它从不需要,它永远不会被实例化。要做到同样的事情Lazy,你可以写

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

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

当然,你是不是仅限于这样做,让与Lazy,但目的是为了说明如何实例化一个值,而实际上这样做,直到它是必要的。调用代码不必跟踪值是否已经实例化;而是,调用代码只使用Value属性。 (有可能找出值是否已被IsValueCreated属性实例化。)

+0

当MyProperty属性将被调用时...如果下面一行执行私人懒惰 _myProperty = new懒惰(()=>新的MyClass()); 财产将如何被称为.....我只是不明白,因为我们需要明确地调用属性。 – Mou

+0

@ user728750我不太确定我明白你在问什么。 '_myProperty'只是一个私有的实例变量。你也可以在包含类的构造函数中初始化它(实际上这可能是更好的练习)。该属性的使用在某种程度上是可选的,但它抽象掉了否则需要的'.Value'调用。 – Andrew

+0

有趣的是,同样的事情可以在Scala中完成,只需 'lazy val MyProperty = new MyClass()'。太糟糕了,他们从来没有为.NET发布一个Scala编译器。 – sparebytes

6

退房MSDN文档在这里:对象的Lazy Initialization

延迟初始化意味着它的创作被推迟,直到它被首次使用。延迟初始化主要用于提高性能,避免浪费计算并减少程序内存要求。

8

“延迟初始化时首次Lazy.Value属性进行访问或Lazy.ToString方法被调用。

使用延迟的实例推迟大型或资源密集型对象或创建执行资源密集型任务,特别是在程序生命周期内不会发生这种创建或执行的情况下。

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