当我介绍单例模式时,这就是实现它的方法:
public class MySingleton
{
private MyStingleton instance;
private MySingleton()
{
//constructor
}
public static MySingleton GetInstance()
{
if(instance== null)
{
instance = new MySingleton();
}
return instance;
}
}
与此相比,这样做有什么好处:
public class MySingleton
{
public static readonly MyStingleton Instance = new MySingleton();
private MySingleton()
{
//constructor
}
}
答案 0 :(得分:4)
第一个例子不是线程安全的。您可以查看following article。
答案 1 :(得分:2)
这两个单例实现都是不安全的,我认为使用第二个实现第一个没有任何好处。
你应该查看这个链接:http://www.yoda.arachsys.com/csharp/singleton.html列出了许多单例实现,每个实现都解释了为什么它们好或坏。
最终正确的单身是:
public sealed class Singleton
{
Singleton()
{
}
public static Singleton Instance
{
get
{
return Nested.instance;
}
}
class Nested
{
// Explicit static constructor to tell C# compiler
// not to mark type as beforefieldinit
static Nested()
{
}
internal static readonly Singleton instance = new Singleton();
}
}
答案 2 :(得分:2)
在第一个实例中,在调用GetInstance静态方法之前,不会创建实例。在调用此方法时创建实例。
在第二个例子中,实例是一个常数,在概念上是不同的。
用于使用第一个,是我一直看到的模式,你可以控制创建实例的时间。