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

时间:2015-05-08 15:08:26

标签: c# .net

我只是在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#的情况相同

4 个答案:

答案 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();
}