静态构造函数和Singleton类

我有一个实现Singleton设计模式的对象缓存。 我对单例的方法总是在首次访问属性时延迟加载静态实例。

public static Widget { get { if(instance==null) instance = new Widget(); return instance; } } 

但是,我知道这种方法不是线程安全的,并且实例检查为null会导致效率低下。 在实例化静态实例的类上实现静态构造函数是否明智?

据我所知,只要第一次静态属性访问发生,就会调用静态构造函数。 这是否有效,它是否会提供超过当前延迟加载方法的任何好处,或者更好地探索代理实现,还是使用锁来强制它是线程安全的?

 public static Widget { get { if(instance==null) { lock(padlock) { if(instance==null) instance = new Widget(); } } return instance; } } 

我对静态构造函数没有很多经验,所以如果它是延迟加载属性的相同或更差的实现,不要想要实现这个想法。

干杯,加里

Jon Skeet有一篇关于单身人士讨论这个问题的好文章 。

我建议只使用Joe Duffy的懒惰初始化程序类,而不是滚动自己的线程安全延迟初始化程序并可能出错。

http://www.bluebytesoftware.com/blog/PermaLink,guid,a2787ef6-ade6-4818-846a-2b2fd8bb752b.aspx