我的C#程序中有一个错误,导致堆栈溢出异常
我有两张表格。其中之一是一个表单,用户可以选择一个学校班级,然后单击“确定”。我用 公共整数[]梯度类=新整数[2] 保存已选择的学校班级。(类列表是组合框) 在那之后,我打开另一个新表格来编辑那个班学生的信息。 我使用这样的开关:我的C#程序中有一个错误,导致堆栈溢出异常,c#,C#,我有两张表格。其中之一是一个表单,用户可以选择一个学校班级,然后单击“确定”。我用 公共整数[]梯度类=新整数[2] 保存已选择的学校班级。(类列表是组合框) 在那之后,我打开另一个新表格来编辑那个班学生的信息。 我使用这样的开关: switch(grad_class) { case "11": something to do..., break; case "12": something to do..., break; } public form1() { var f2
switch(grad_class)
{
case "11": something to do..., break;
case "12": something to do..., break;
}
public form1() {
var f2 = new form2();
}
public form2() {
var f1 = new form1();
}
但我的问题是:
我在表1中定义了“毕业班”。因此,当我想使用它时,我必须这样做:
form1 f1 = new form1();
f1.grade_class;
在2号表格中,我称之为代码。
在表格1中,我呼吁:
form2 f2 = new form2();
发生堆栈溢出异常 您声明:
form1 f1 = new form1();
f1.grade_class;
在2号表格中,我称之为代码。在表格1中,我呼吁:
form2 f2 = new form2();
这就是你的问题。您声明在form1
中调用form2.ctor
,在form2
中调用form1.ctor
。因此,您的代码如下所示:
switch(grad_class)
{
case "11": something to do..., break;
case "12": something to do..., break;
}
public form1() {
var f2 = new form2();
}
public form2() {
var f1 = new form1();
}
当然,这会导致堆栈溢出。这些是相互递归的函数。您没有返回条件,因此耗尽了堆栈空间。很简单,所发生的事情是,当一个方法完成时,机器必须存储关于下一步要去哪里的状态。它通常将这些信息存储在称为堆栈的空间中。但是,堆栈是有边界的,因此如果通过反复调用方法将太多“this is to next”块推到堆栈上,则会耗尽此堆栈空间并出现臭名昭著的堆栈溢出异常
编辑:你说:
namespace TeacherBook {
public partial class ChooseGrade : Form {
public int[] grad_class=new int[2]; //int array for grade & class (first for Grade,second for class)
EditStudent StdForm = new EditStudent();
}
namespace TeacherBook {
public partial class EditStudent : Form {
ChooseGrade ChGrade = new ChooseGrade(); // define form
}
}
实际上是我所怀疑的。在
ChooseGrade
中有一个字段初始值设定项,它实例化了EditStudent
的一个新实例。但是EditStudent
有一个字段初始值设定项,用于实例化ChooseGrade
的新实例。因此,当您实例化ChooseGrade
的新实例时,这会导致调用editsudent
的构造函数,这会导致调用ChooseGrade
的构造函数,这会导致调用editsudent
的构造函数,一直到堆栈溢出。form2的构造函数是什么样子的?显示form2构造函数的代码。关于StackOverflow上的堆栈溢出的问题?我想我自己的堆栈溢出了。显然form2
的构造函数中有问题。您还有一个严重的设计问题,这使得您很难对程序进行推理。请阅读,帮助我们,帮助你。你被什么弄糊涂了?嗯,这并没有告诉我你被什么弄糊涂了,但好吧,我会跟你玩的。消除相互递归。这些形式相互包含是没有意义的。