为什么当我尝试实例化一个类实例时,我是否得到StackOverFlowException?

时间:2010-06-13 18:51:47

标签: c#

每当我实例化A类的实例时,我都会不断获得StackOverFlowException。我知道它与A.b字段是从类A派生的类型这一事实有关。但为什么会导致异常呢?

static void Main(string[] args)
{
     A a = new A(); // exception
}

class A 
{
    private B b = new B();
}

class B:A {}

谢谢

7 个答案:

答案 0 :(得分:5)

因为B是从A继承的,所以每次创建A时,都会创建一个B,然后创建另一个B.你基本上创建了一个无限循环的类创建。

答案 1 :(得分:4)

以下是幕后发生的事情

  1. 创建A
  2. 的新实例
  3. 因此,它会为私有字段B
  4. 创建b的实例
  5. B派生自A,因此拥有自己的字段b。此时它返回到步骤#2并重复直到发生堆栈溢出

答案 2 :(得分:1)

因为A引用了一个B类,它是从A派生的。由于构造函数链接,B的ctor调用A的ctor,导致创建一个新的B实例,它将持续到永恒或一个StackOverflowException。

答案 3 :(得分:1)

因为构造函数是递归调用的

答案 4 :(得分:1)

因为你有一个循环引用

为了制作B你必须制作A 为了制作A,你必须制作一个B

因此它向下隧道。

要修复它,请不要初始化私有字段。

答案 5 :(得分:1)

如果您希望子类知道任何派生类型,请使用泛型。这在CSLA.NET Framework中非常重要。

public class A<T> where T : A<T>
{

}

public class B : A<B>
{

}

请注意,A不引用B,但您可以在方法等基础上封装派生类型。

答案 6 :(得分:0)

当你创建一个A的实例时,它会创建一个B ....的内部实例 - 猜测是什么 - 创建一个B的内部实例 - 猜测是什么 - 创建一个B的内部实例 - 它将 - 猜猜看 - 创建一个B的内部实例。

这是因为B构造函数继承了递归的A构造函数。堆栈溢出。