当我从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
的情况下做到这一点?
答案 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}}再次......你看到这变成了无限递归? Form1
和Form1
的构造函数永远地来回地相互调用(或者至少直到程序达到递归的极限并抛出StackOverflowException)。
如果删除默认值并且将字段的实例化放在单独的方法中,则代码运行正常的原因是因为该方法直到程序中的后期才会被调用。 MyClass
的构造函数将调用MyClass
的构造函数然后返回,允许您的程序以其快乐的方式继续。