Singleton类包含每个其他字段的空引用异常

时间:2016-03-25 12:11:19

标签: c# .net singleton

在我的应用程序中,我需要几个单例类。它们中的每一个都有一些其他单例类的字段来使用它们。下面我用简单的例子重建了这个问题:

  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();
    }
}

空引用异常即将发生,因为字段为空。那么如何初始化和使用这种相互连接的单例类呢?

1 个答案:

答案 0 :(得分:0)

构造函数不是并行运行的,所以当第一个构造函数创建时,尚未创建第二个Singleton。

不是直接将属性设置为值,而是可能在B类中编写类似的内容:

private A AProp {
  get {
    if(a == null)
      a = A.Instance;

    return a;  
  }
}

你在A组中反过来也是如此。因此,在第一次访问之前,该值会被延迟,并且此时已经创建了另一个Singleton。

在什么情况下,这样一个好主意是另一个问题。特别是考虑到不是在本地字段中访问它,您总是可以使用A.Instance来访问它(因此当地字段在那时变得多余。