5

延迟实例化是否使用更少的代码但获得相同的结果?当然,这通常是一件好事(只要使代码简短/高效不会损害可读性/可维护性)。

请参考这个惰性实例化:

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

4

5 回答 5

13

假设我们有一个构造昂贵的类型的字段

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

这段代码的问题在于,实例化Foo会导致实例化的性能成本Expensive——无论该Expensive字段是否被访问过。显而易见的答案是按需构造实例或懒惰地实例化该字段:

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

这是懒惰的实例化。

于 2012-09-25T13:37:56.223 回答
6

延迟初始化是一种仅在第一次需要时才加载或初始化对象的做法。

这可能会给您带来很大的性能提升,尤其是当您的应用程序中有大量组件时。

查看Wikipedia页面以获得更深入的了解(它包含编码示例)。

于 2012-09-25T13:32:22.710 回答
5

不,惰性实例化意味着在您真正需要之前不要花费任何时间和资源来创建某些东西。

在您的单例示例中,在instance实际使用之前,它只是一个空引用。当它被使用时,会花费资源来实例化对象new

于 2012-09-25T13:31:39.613 回答
2

它是懒惰的,因为该类的实例Singleton直到您第一次请求它时才创建。

于 2012-09-25T13:31:47.277 回答
2

对象的延迟初始化意味着它的创建被推迟到它第一次被使用。

有关完整参考,请参阅 msdn 后延迟初始化

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

于 2012-09-25T13:32:00.257 回答