有不少很好的文章介绍过这个主题了,因此也就不再赘述怎么实现了,都在下面的参考资料里了,一看便知。
我想说的这个缺点是静态构造函数有可能发生异常,一旦静态构造函数引发异常,不仅会导致访问失败,而且依照静态构造函数只运行一次的特点,运行时将不会再次调用该构造函数,并且在程序运行所在的应用程序域的生存期内,类型将保持未初始化,导致访问失败,也就是说,第一次运行失败后,就没有再修复错误的机会了。
举例来说,如果想将数据库中的某些公用数据,比如菜单,或某些权限之类的,将他们放在单例中,或者进一步将单例的数据缓存到memcached或appfabric中方便后续使用之时,假如数据库当前不可用,或者缓存服务当前不可用等等缘故,取数据或存缓存的动作失败,静态构造函数就会出现异常,也就出现了无法访问系统的情况,如果是web系统,则非要重起应用程序池或者www服务才能解决问题。
所以,我想静态初始化也许不太适合用在需要读取数据库,存储缓存等场合,这些场合出状况的可能性比较大,比如数据库和网站在不同的机器上,如果数据库和网站服务器同时重起,网站服务器启动快,数据库服务器启动慢,则网站提供服务之时数据库还不可用,这样,此时一旦有人访问网站,静态构造函数开始初始化,遇到异常,之后就无法修复了,无论后续谁访问,无论数据库是否已经可用,系统都直接给你返回错误。
因此,在这种情况下,还是用lock的比较传统的单例实现模式比较更可靠些,起码一次不成功后还有再修复错误的机会。
不知各位以为如何?
参考资料:
静态构造函数(C# 编程指南)
http://msdn.microsoft.com/zh-cn/library/k9x6w0hc(v=VS.100).aspx
Singleton
http://msdn.microsoft.com/zh-cn/library/ms998426.aspx
在 C# 中实现 Singleton
http://msdn.microsoft.com/zh-cn/library/ms998558.aspx
Static constructors and way forward (.NET optimized Singleton pattern)
http://www.codeproject.com/KB/architecture/StaticCtor_Singleton.aspx