众所周知,Singleton模式是设计模式中比较简单和容易实现的模式之一,对此我就不详细描述其基本原理和用途,只谈谈在.NET中的实现。
MSDN中有专门一篇文章《在 C# 中实现 Singleton》对此进行描述。
其中描述了最简单的实现方式:原始代码
public sealed class Singleton
{
private static readonly Singleton instance = new Singleton();
private Singleton(){}
public static Singleton Instance
{
get
{
return instance;
}
}
}
{
private static readonly Singleton instance = new Singleton();
private Singleton(){}
public static Singleton Instance
{
get
{
return instance;
}
}
}
而对于静态构造函数,MSDN中是这样描述的“静态构造函数用于初始化类。在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数来初始化类。”参见
一直以来我都不太赞同使用静态构造方法去构建Singleton模式。然而当我用反编译器反编译原始代码之后,大跌眼镜(虽然我没有眼睛),发现反编译出来代码就是用静态构造函数去初试化的。这是反编译出来的结果。
public sealed class Singleton
{
private static readonly Singleton instance;
private static Singleton()
{
instance = new Singleton();
}
private Singleton();
public static Singleton Instance
{
get
{
return Singleton.instance;
}
}
}
{
private static readonly Singleton instance;
private static Singleton()
{
instance = new Singleton();
}
private Singleton();
public static Singleton Instance
{
get
{
return Singleton.instance;
}
}
}
因此我得出结论可以断定,C#中的静态构造函数是实现Singleton模式的。
而对于多线程的环境下,MSDN开发精选2期中对C#实现Singleton模式的文章中也明确表明,.NET framework的机制其实已经保证了用第一种方法实现的Singleton多线程安全,原因是什么呢?文章中没说。
其实就是静态构造函数。