懒惰的单例初始化

Len*_*nik 3 .net c# singleton design-patterns

在阅读Jon Skeet关于C#中单例的文章时,我开始想知道为什么我们首先需要延迟初始化.似乎文章中的第四种方法应该足够了,这里仅供参考:

public sealed class Singleton
{
    static readonly Singleton instance=new Singleton();

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

    Singleton()
    {
    }

    public static Singleton Instance
    {
        get
        {
            return instance;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在极少数情况下,在单例上有其他静态方法,延迟初始化可能有好处,但这不是一个好的设计.

那么人们可以告诉我为什么懒惰的初始化是如此热门的事情?

Cha*_*ana 10

在那些可能根本不需要初始化的情况下,并且初始化成本很高(在CPU周期或资源方面),然后实现延迟初始化可以在不需要对象的情况下节省成本. .

如果始终需要该对象,或者初始化相对便宜,那么延迟初始化器没有额外的好处.

在任何情况下,不正确地实现惰性初始化程序可以使单例非线程安全,因此如果您需要此模式,请小心正确执行.Jon的文章有一个模式,(我认为这是最后一个),解决了这个问题.


Ree*_*sey 5

如果您要使用该类型的唯一原因是引用实例,则不需要对单例进行延迟初始化。

但是,如果您引用该类型或该类型本身的任何其他属性或方法,则将初始化该单例。

诚然,好的设计会将一项任务留给一种类型,所以这应该不是问题。但是,如果您使单例类变得“复杂”,则延迟初始化可以帮助您避免因初始化过早而产生后果。

  • 延迟初始化作为一般实践非常有用,但不一定适用于单例。 (3认同)