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的文章有一个模式,(我认为这是最后一个),解决了这个问题.
如果您要使用该类型的唯一原因是引用实例,则不需要对单例进行延迟初始化。
但是,如果您引用该类型或该类型本身的任何其他属性或方法,则将初始化该单例。
诚然,好的设计会将一项任务留给一种类型,所以这应该不是问题。但是,如果您使单例类变得“复杂”,则延迟初始化可以帮助您避免因初始化过早而产生后果。