我有一段代码
public class A
{
public A()
{
Console.WriteLine("A");
}
B b = new B("From A");
}
public class B : A
{
public B()
{
Console.WriteLine("B");
}
public B(string str) //Getting exception here
{
Console.WriteLine("In B " + str);
}
}
public class C : A
{
B b = new B("From C");
public C()
{
Console.WriteLine("C");
}
}
class Program
{
static void Main(string[] args)
{
new C();
Console.ReadKey();
}
}
在这里,我知道在调用基础构造函数之前首先初始化所有属性,但是我无法找到为什么我得到Stackoverflow异常。任何帮助?感谢
答案 0 :(得分:10)
因为B继承自A,所以它继承了
B b = new B("From A");
字段。因此,无论何时创建B对象,它都会在无限递归链中创建另一个B对象。
因此,在您拥有的实际程序中,您将创建一个C对象。然后使用带有字符串的重载(“From C”)构造一个B对象。然后,您在该构造函数上获得一个异常,因为它会递归地创建无限的B对象。
答案 1 :(得分:4)
递归无限循环:
b
)。答案 2 :(得分:0)
由于B继承自A
//公共类B:A
当你在A类中创建B的对象时,它进入递归无限循环。
答案 3 :(得分:0)
上述问题是由于循环实例化。
在这里,我们对实例化的思考导致了这些问题: 这里当我们实例化C时,我们只是没有得到C类的对象,但实际上它是C + B + A的组合。
通过从实例化对象到实例化对象绘制带箭头的对象图,可以轻松识别这类问题。