两个相互引用的单身人士正在崩溃

时间:2014-08-20 14:56:11

标签: c# design-patterns static unity3d

我有以下两个单身人士:

public sealed class MyClass : ISomeInterface<anotherClass>
{ 
  private static MyClass instance = null;
  private ISomeInterface <anotherClass> parentState = Other.Instance; // error
  private ISomeInterface <anotherClass> childState = null; 
  private MyClass(){}

public static MyClass Instance
{
    get
    {
         if(instance == null)
         {
            instance = new MyClass();
         }
         return instance;
     }
 }
}

public sealed class Other : ISomeInterface<anotherClass>
{ 
  private static Other instance = null;
  private ISomeInterface <anotherClass> parentState = null;
  private ISomeInterface <anotherClass> childState = MyClass.Instance; 
  private Other(){}

public static Other Instance
{
    get
    {
         if(instance == null)
         {
            instance = new Other();
         }
         return instance;
     }
 }
}

不幸的是,我没有收到任何错误,但是一旦我访问Myclass Unity3d的父状态崩溃。我也不能在初始化附近有一个断点。

当我在Instance Property中初始化字段时,它可以工作。当我将字段设置为静态时,它也可以工作:

private static ISomeInterface<anotherClass> parentState = Other.Instance;

任何人都可以解释为什么我的第一种方法不起作用吗?

2 个答案:

答案 0 :(得分:2)

问题

通过每次创建一个新实例来创建无限递归,最终会导致StackOverflowException。这是因为你坚持要求每个Singleton都引用另一个。


为什么静态工作

静态不会因为"execution of the static field initializers occurs immediately prior to executing that static constructor. Otherwise, the static field initializers are executed at an implementation-dependent time prior to the first use of a static field of that class." - Static field initialization而给您带来问题。


另一种解决问题的方法

如果你让两个单身人士都使用急切的实例而不是懒惰你就不会遇到这个问题。急切的实例化看起来像这样:

public class Singleton
{
    private static Singleton instance = new Singleton();

    public static Singleton getInstance { get { return instance; } }
}

这样可行,因为它不依赖于谁调用Singleton来创建实例。

答案 1 :(得分:1)

通过引用eachothers构造函数的构造函数成员创建无限循环:

在MyClass中你有:

private ISomeInterface <anotherClass> parentState = Other.Instance;

在其他课程中你有:

private ISomeInterface <anotherClass> childState = MyClass.Instance; 

即。 MyClass创建导致其他创建,导致MyClass创建......等等。

当这些成员静态时它起作用的原因是静态成员在第一次访问静态成员之前和静态构造函数(如果有的话)被调用之前被初始化。 / p>