在我的应用程序中,我需要几个单例类。它们中的每一个都有一些其他单例类的字段来使用它们。下面我用简单的例子重建了这个问题:
public sealed class A
{
private B b = B.Instance;
private static readonly A instance = new A();
public static A Instance { get { return instance; } }
static A() { }
private A() { }
public void Do()
{
b.ToString();
}
}
public sealed class B
{
A a = A.Instance;
private static readonly B instance = new B();
public static B Instance { get { return instance; } }
static B() { }
private B() { }
public void Do()
{
a.ToString();
}
}
class Program
{
static B b = B.Instance;
static A a = A.Instance;
static void Main(string[] args)
{
b.Do();
a.Do();
}
}
空引用异常即将发生,因为字段为空。那么如何初始化和使用这种相互连接的单例类呢?
答案 0 :(得分:0)
构造函数不是并行运行的,所以当第一个构造函数创建时,尚未创建第二个Singleton。
不是直接将属性设置为值,而是可能在B类中编写类似的内容:
private A AProp {
get {
if(a == null)
a = A.Instance;
return a;
}
}
你在A组中反过来也是如此。因此,在第一次访问之前,该值会被延迟,并且此时已经创建了另一个Singleton。
在什么情况下,这样一个好主意是另一个问题。特别是考虑到不是在本地字段中访问它,您总是可以使用A.Instance来访问它(因此当地字段在那时变得多余。