什么是懒惰的实例化

时间:2012-09-25 13:29:59

标签: c# lazy-initialization

关于使用更少代码但得到相同结果的懒惰实例化?当然,这通常是一件好事(提供简短/高效的代码不会损害可读性/可维护性)。

请参阅这个懒惰的实例:

public sealed class Singleton
{
    private Singleton()
    {
    }

    public static Singleton Instance { get { return Nested.instance; } }

    private class Nested
    {
        // Explicit static constructor to tell C# compiler
        // not to mark type as beforefieldinit
        static Nested()
        {
        }

        internal static readonly Singleton instance = new Singleton();
    }
} 

没有Instance的私有属性(我知道它是隐含的) - 它是否使它变得懒惰 - 事实上我们在public static Singleton Instance属性中没有setter?

5 个答案:

答案 0 :(得分:13)

假设我们有一个构造成本昂贵的领域

class Foo
{
    public readonly Expensive expensive = new Expensive();
    ...
}

此代码的问题在于,Foo的实施会导致实现Expensive的性能成本 - 无论是否访问Expensive字段。显而易见的答案是按需构建实例或 lazily instansiate 该字段:

class Foo
{
    Expensive _expensive;
    public Expensive
    {
        get
        {
            if (_expensive == null) _expensive = new Expensive();
            return _expensive;
        }
    }
    ...
}

这是懒惰的实施。

答案 1 :(得分:6)

延迟初始化是一种做法,您只需在第一次需要时加载或初始化对象

潜在地,这可以为您带来巨大的性能提升,特别是如果您的应用程序中有大量组件。

请查看Wikipedia页面以获得更深入的了解(以编码示例为特色)。

答案 2 :(得分:5)

不,懒惰的实例化意味着在实际需要它之前,不会花费任何时间和资源创建一些东西。

在你的单例示例中,instance只是一个空引用,直到实际使用它为止。当它被使用时,然后你花费资源用new实例化对象。

答案 3 :(得分:2)

这是懒惰的,因为类Singleton的实例直到您第一次提出时才会创建。

答案 4 :(得分:2)

对象的延迟初始化意味着它的创建将延迟到首次使用为止。

有关完整参考,请参阅msdn post Lazy Initialization

在上面的代码中,在调用它之前不会创建单例类的实例。 因此,在调用代码之前,您的程序不会使用资源。