看李会军的帖子:http://www.cnblogs.com/Terrylee/archive/2005/12/09/293509.html
对静态初始化不理解,不明白为什么要搞这么复杂。
这是我的实现:
public class Singleton
{
static Singleton instance = new Singleton();
Singleton()
{
}
public static Singleton GetInstence
{
get { return instance; }
}
}
请问这个有什么缺点?
李会军的原文如下:
1public sealed class Singleton
2{
3 static readonly Singleton instance=new Singleton();
4
5 static Singleton()
6 {
7 }
8
9 Singleton()
10 {
11 }
12
13 public static Singleton Instance
14 {
15 get
16 {
17 return instance;
18 }
19 }
20}
21
看到上面这段富有戏剧性的代码,我们可能会产生怀疑,这还是Singleton模式吗?在此实现中,将在第一次引用类的任何成员时创建实例。公共语言运行库负责处理变量初始化。该类标记为 sealed 以阻止发生派生,而派生可能会增加实例。此外,变量标记为 readonly,这意味着只能在静态初始化期间(此处显示的示例)或在类构造函数中分配变量。
该实现与前面的示例类似,不同之处在于它依赖公共语言运行库来初始化变量。它仍然可以用来解决 Singleton 模式试图解决的两个基本问题:全局访问和实例化控制。公共静态属性为访问实例提供了一个全局访问点。此外,由于构造函数是私有的,因此不能在类本身以外实例化 Singleton 类;因此,变量引用的是可以在系统中存在的唯一的实例。
由于 Singleton 实例被私有静态成员变量引用,因此在类首次被对 Instance 属性的调用所引用之前,不会发生实例化。
这种方法唯一的潜在缺点是,您对实例化机制的控制权较少。在 Design Patterns 形式中,您能够在实例化之前使用非默认的构造函数或执行其他任务。由于在此解决方案中由 .NET Framework 负责执行初始化,因此您没有这些选项。在大多数情况下,静态初始化是在 .NET 中实现 Singleton 的首选方法。
你两不是 一样的吗 ?
不是啊,我的类不需要sealed啊
@暗夜娜姐: 构造函数私有化了,可以不要sealed 了。
另外 你的 应该加上 readonly,不加的话,还是可以改变的,如:
public class Singleton
{
static Singleton instance = new Singleton();
Singleton()
{
}
public static Singleton GetInstence
{
get { return instance; }
}
public void ReCreate()
{
instance = new Singleton();
}
}
// Singleton.GetInstence.ReCreate();
你可能会说 不会写这样的方法,但是 使用instance 实例是会操作很多方法的,还是在技术上加上,而不是 希望别人不要这样写。
@Qlin: 说的好,我明白了,多谢
他应该说了很清楚 从多线程方面考虑