我只是在c#中尝试了一些东西,我遇到了这个我在类本身为同一个类创建了一个对象
class Class1
{
public int test1 { get; set; }
Class1 x = new Class1();
}
然后我试图从另一个抛出错误的类创建对象
类型'System.StackOverflowException'的未处理异常 发生在Test.exe
中
class Program
{
static void Main(string[] args)
{
Class1 x = new Class1();
}
}
我用google搜索,但我没有找到任何与c#相关的链接,但我发现它在c ++中,他们说Class1是一个不完整的类型,因为它尚未定义,而是它被定义。我想知道它是否与c#的情况相同
答案 0 :(得分:11)
Class1
创建Class1
,创建另一个Class1
,创建另一个Class1
,其中...... {/ p>
因此每个构造函数调用都会被添加到执行堆栈中,直到它溢出。
由于您没有使用该实例指定您想要做的内容,因此无法知道正确答案是什么。
对于好极客幽默,Google recursion
答案 1 :(得分:4)
非常简单,每次创建Class1
时都会遇到问题,该对象会创建自己的Class1
。因此,在你爆炸之前,你要进行递归。
你可以调试它并观察会发生什么。在Class1
某处设置一个断点,并观察它一遍又一遍地被击中。
答案 2 :(得分:3)
类可以包含自身的对象,但是您无法在构造函数中或在声明时实例化该对象。这将导致无限递归和StackOverflow
异常。
您可以使用单独的方法来实例化:
class Class1
{
public int test1 { get; set; }
private Class1 x;
public void CreateClass1()
{
x = new Class1();
}
}
然后将其称为:
Class1 obj = new Class1();
obj.CreateClass1();
答案 3 :(得分:1)
在创建Class1
实例期间,不要创建Class1
的实例。改为占位符:
class Class1
{
public int test1 { get; set; }
public Class1 AnotherClass1;
}
在创建之后或在创建期间提供对另一个(已创建的实例)的引用作为构造函数参数:
static void Main(string[] args)
{
Class1 x = new Class1();
x.AnotherClass1 = new Class1();
}