.NET 4中的懒惰初始化是什么?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (14)

什么是延迟初始化。这里是我搜索谷歌后的代码。

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")
    );

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

提问于
用户回答回答于

Lazy.NET 4.0 中的功能的目的是将许多开发人员以前使用的模式替换为属性。“老”的方式会是这样的

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属性实例化。)

用户回答回答于

“第一次访问Lazy.Value属性或调用Lazy.ToString方法时会发生延迟初始化。

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

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

扫码关注云+社区