我只是在 c# 中尝试一些东西,我遇到了这个问题,我在类本身中为同一类创建了一个对象
class Class1
{
public int test1 { get; set; }
Class1 x = new Class1();
}
然后我尝试从另一个引发错误的类创建对象
类型为"System.StackOverflowException"的未处理异常 发生在测试中.exe
class Program
{
static void Main(string[] args)
{
Class1 x = new Class1();
}
}
我用谷歌搜索过,但我没有找到任何与 C# 相关的链接,但我在 C++ 中找到了它,他们说 Class1 是一个不完整的类型,因为它还没有被定义,而是正在定义。我想知道 c# 是否也是如此
Class1
创建一个Class1
,这会创建另一个Class1
,这会创建另一个Class1
,这...
因此,每个构造函数调用都会添加到执行堆栈中,直到它溢出。
由于您没有指定要对实例执行的操作,因此无法知道正确的答案是什么。
为了好极客幽默,谷歌递归
这很简单,你的问题是每次你创建一个Class1
时,该对象都会创建自己的Class1
。 因此,你会递归,直到你爆炸。
您可以调试它并观察会发生什么。 在某处Class1
设置断点,并看着它一遍又一遍地被命中。
类可以包含自身的对象,但不能在构造函数中或在声明时实例化该对象。这将导致无限递归和StackOverflow
异常。
你可以有一个单独的方法来实例化,例如:
class Class1
{
public int test1 { get; set; }
private Class1 x;
public void CreateClass1()
{
x = new Class1();
}
}
然后像这样称呼它:
Class1 obj = new Class1();
obj.CreateClass1();
只是不要在创建实例期间创建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();
}