我的代码在执行时抛出 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 窗体中放置了一个子窗体,并在父窗体的构造函数中实例化了子窗体。 通过在方法内的构造函数外部实例化表单解决了该问题。