创建新对象会触发异常c#

时间:2016-12-11 01:44:21

标签: c# class exception

当我从MyClass类创建一个新东西时,它会触发异常。

namespace class_test
{
    public partial class Form1 : Form
    {
        public Form1()
    {
        InitializeComponent();
    }

    MyClass thing = new MyClass();

    private void button1_Click(object sender, EventArgs e)
    {
        textBox1.Text = thing.x.ToString();
        thing.x++;
    }
}

班级代码:

namespace debugging_class
{
    class MyClass : Form1
    {
        public int x = 100;
    }
}

通过测试,我发现类代码中的: Form1是问题所在。我正在使用它,因为我想访问类中的Form1对象。有没有办法在不使用: Form1的情况下做到这一点?

1 个答案:

答案 0 :(得分:1)

问题确实是无限递归之一。创建MyClass对象时,它会调用该类的构造函数。由于MyClass继承自Form1,并且您尚未为MyClass指定默认(无参数)构造函数,因此它将隐式调用Form1的构造函数。

问题是你的Form1代码中有一个具有默认值的类级变量。当类具有默认值的字段时,将在该对象的构造函数的开头使用给定值隐式设置这些变量。所以,例如,代码:

public class SomeClass
{
    public int i = 5;

    public SomeClass()
    {
        // Just a simple call and that's it
        Console.WriteLine(i);
    }
}

实际上会编译成类似于以下内容的内容:

public class SomeClass
{
    public int i;

    public SomeClass()
    {
        // Assign default values to class instance fields
        i = 5;

        // Execute the rest of the constructor code
        Console.WriteLine(i);
    }
}

所以问题就出现了 - 您的Form1课程的MyClass字段的默认值为new MyClass()。该字段将在Form1的构造函数中分配。因为MyClass继承自Form1,所以Form1的构造函数也会被调用,然后会创建MyClass的新实例,它将调用{{1}的构造函数1}}再次......你看到这变成了无限递归? Form1Form1的构造函数永远地来回地相互调用(或者至少直到程序达到递归的极限并抛出StackOverflowException)。

如果删除默认值并且将字段的实例化放在单独的方法中,则代码运行正常的原因是因为该方法直到程序中的后期才会被调用。 MyClass的构造函数将调用MyClass的构造函数然后返回,允许您的程序以其快乐的方式继续。