我的代码在执行时抛出 stackoverflowexception
My code throws stackoverflowexception when i execute
我正在使用 c# 语言进行 Windows 应用程序开发。
我有一个模板表单 => Masterpage,它被我所有其他表单继承。
它也有打开所有其他表格的菜单条:
我的错误是:
System.WhosebugException
HResult=0x800703E9
Source=<Cannot evaluate the exception source>
StackTrace:
<Cannot evaluate the exception stack trace>
我的主页代码是:
namespace WindowsProject
{
public partial class Masterpage : Form
{
BookEditor bookE;
StudentEditor studentE;
ViewBorrowedBooks viewB;
IssueBook issueBook;
public Masterpage()
{
InitializeComponent();
bookE = new BookEditor();
studentE = new StudentEditor();
viewB = new ViewBorrowedBooks();
issueBook = new IssueBook();
}
private void exitToolStripMenuItem_Click(object sender, EventArgs e)
{
Application.Exit();
}
private void showForm(Form f)
{
bookE.Hide();
studentE.Hide();
viewB.Hide();
issueBook.Hide();
this.Hide();
f.Show();
}
private void booksToolStripMenuItem_Click(object sender, EventArgs e)
{
showForm(bookE);
}
private void studentsToolStripMenuItem_Click(object sender, EventArgs e)
{
showForm(studentE);
}
private void viewBorrowedBooksToolStripMenuItem_Click(object sender, EventArgs e)
{
showForm(viewB);
}
private void issueBookToolStripMenuItem_Click(object sender, EventArgs e)
{
showForm(issueBook);
}
}
}
我的所有其他表格都继承自 Masterpage
为什么会出现WhosebugException
?
WhosebugException
的发生是因为 Masterpage
.
的构造函数内部的无限递归
让我们考虑一下这个递归是如何发生的。 BookEditor
继承了 Masterpage
。 (以下结论也适用于Masterpage
的其他继承人)。我怀疑 BookEditor
有一个没有参数的构造函数 BookEditor()
。在 C#
中,如果您调用不带派生类型参数的构造函数,它默认调用不带基类型参数的构造函数(如果您没有显式指定基类型的其他构造函数)。假设我们要创建 Masterpage
的实例。我们称它的构造函数为Masterpage()
。在它里面我们调用了BookEditor
的构造函数。但是 BookEditor
继承了 Masterpage
,因此它调用了 Masterpage
的构造函数。 Masterpage
的构造函数再次调用 BookEditor
的构造函数等。这些构造函数调用序列导致无限递归,结果是 WhosebugException
。
你应该如何解决这个问题?
我认为需要更多信息才能彻底回答这个问题。
作为解决方法,您应该在其构造函数之外创建 Masterpage
的继承者:
public partial class Masterpage : Form
{
private readonly IEnumerable<Form> _forms;
public Masterpage()
{
InitializeComponent();
}
// Now we set forms here, not in the constructor.
public void SetForms(IEnumerable<Form> forms)
{
_forms = forms;
}
private void showForm(Form f)
{
foreach (Form form in _forms)
form.Hide();
this.Hide();
f.Show();
}
// Other members of the Masterpage.
...
}
// Palce this code where you create and show Masterpage.
var bookE = new BookEditor();
var studentE = new StudentEditor();
var viewB = new ViewBorrowedBooks();
var issueBook = new IssueBook();
var forms = new List<Form> {bookE, studentE, viewB, issueBook};
bookE.SetForms(forms);
studentE.SetForms(forms);
viewB.SetForms(forms);
issueBook.SetForms(forms);
var masterPage = new Masterpage();
masterPage.SetForms(forms);
谢谢大家回答我的问题。
我在我的代码中发现的问题是它无限循环,因为我在父 MDI 窗体中放置了一个子窗体,并在父窗体的构造函数中实例化了子窗体。
通过在方法内的构造函数外部实例化表单解决了该问题。
我正在使用 c# 语言进行 Windows 应用程序开发。 我有一个模板表单 => Masterpage,它被我所有其他表单继承。
它也有打开所有其他表格的菜单条:
我的错误是:
System.WhosebugException
HResult=0x800703E9
Source=<Cannot evaluate the exception source>
StackTrace:
<Cannot evaluate the exception stack trace>
我的主页代码是:
namespace WindowsProject
{
public partial class Masterpage : Form
{
BookEditor bookE;
StudentEditor studentE;
ViewBorrowedBooks viewB;
IssueBook issueBook;
public Masterpage()
{
InitializeComponent();
bookE = new BookEditor();
studentE = new StudentEditor();
viewB = new ViewBorrowedBooks();
issueBook = new IssueBook();
}
private void exitToolStripMenuItem_Click(object sender, EventArgs e)
{
Application.Exit();
}
private void showForm(Form f)
{
bookE.Hide();
studentE.Hide();
viewB.Hide();
issueBook.Hide();
this.Hide();
f.Show();
}
private void booksToolStripMenuItem_Click(object sender, EventArgs e)
{
showForm(bookE);
}
private void studentsToolStripMenuItem_Click(object sender, EventArgs e)
{
showForm(studentE);
}
private void viewBorrowedBooksToolStripMenuItem_Click(object sender, EventArgs e)
{
showForm(viewB);
}
private void issueBookToolStripMenuItem_Click(object sender, EventArgs e)
{
showForm(issueBook);
}
}
}
我的所有其他表格都继承自 Masterpage
为什么会出现WhosebugException
?
WhosebugException
的发生是因为 Masterpage
.
让我们考虑一下这个递归是如何发生的。 BookEditor
继承了 Masterpage
。 (以下结论也适用于Masterpage
的其他继承人)。我怀疑 BookEditor
有一个没有参数的构造函数 BookEditor()
。在 C#
中,如果您调用不带派生类型参数的构造函数,它默认调用不带基类型参数的构造函数(如果您没有显式指定基类型的其他构造函数)。假设我们要创建 Masterpage
的实例。我们称它的构造函数为Masterpage()
。在它里面我们调用了BookEditor
的构造函数。但是 BookEditor
继承了 Masterpage
,因此它调用了 Masterpage
的构造函数。 Masterpage
的构造函数再次调用 BookEditor
的构造函数等。这些构造函数调用序列导致无限递归,结果是 WhosebugException
。
你应该如何解决这个问题?
我认为需要更多信息才能彻底回答这个问题。
作为解决方法,您应该在其构造函数之外创建 Masterpage
的继承者:
public partial class Masterpage : Form
{
private readonly IEnumerable<Form> _forms;
public Masterpage()
{
InitializeComponent();
}
// Now we set forms here, not in the constructor.
public void SetForms(IEnumerable<Form> forms)
{
_forms = forms;
}
private void showForm(Form f)
{
foreach (Form form in _forms)
form.Hide();
this.Hide();
f.Show();
}
// Other members of the Masterpage.
...
}
// Palce this code where you create and show Masterpage.
var bookE = new BookEditor();
var studentE = new StudentEditor();
var viewB = new ViewBorrowedBooks();
var issueBook = new IssueBook();
var forms = new List<Form> {bookE, studentE, viewB, issueBook};
bookE.SetForms(forms);
studentE.SetForms(forms);
viewB.SetForms(forms);
issueBook.SetForms(forms);
var masterPage = new Masterpage();
masterPage.SetForms(forms);
谢谢大家回答我的问题。 我在我的代码中发现的问题是它无限循环,因为我在父 MDI 窗体中放置了一个子窗体,并在父窗体的构造函数中实例化了子窗体。 通过在方法内的构造函数外部实例化表单解决了该问题。