C# 在类本身中为同一类创建对象

  • 本文关键字:一类 创建对象 c# .net
  • 更新时间 :
  • 英文 :


我只是在 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();
}

最新更新