System.StackOverflowException 在表单之间切换时

System.StackOverflowException when switching between forms

我正在尝试为我正在开发的游戏创建菜单。这是源代码:

   using System;
   using System.Collections.Generic;
   using System.ComponentModel;
   using System.Data;
   using System.Drawing;
   using System.Linq;
   using System.Text;
   using System.Threading.Tasks;
   using System.Windows.Forms;

namespace Racing_Manager
{

public partial class Form1 : Form
{
    Form1 form1 = new Form1();
    public Form1()
    {
        InitializeComponent();

    }

    private void Form1_Load(object sender, EventArgs e)
    {

    }

    //Exit Button
    private void button1_Click(object sender, EventArgs e)
    {
        Application.Exit();
    }
    //Help Button
    private void Help_Click(object sender, EventArgs e)
    {

    }

    //Play Button
    private void Play_Click(object sender, EventArgs e)
    {
        Hide();
        Form2 secondMenu = new Form2();
        secondMenu.Show();

    }
    }
    }

那么我有:

namespace Racing_Manager
{
public partial class Form2 : Form
{
    public Form2 form2 = new Form2();
    public Form2()
    {
        InitializeComponent();
    }

    //Back Button
    private void button2_Click(object sender, EventArgs e)
    {
        Hide();
        Form1 form1 = new Form1();
        form1.Show();

    }
    }
    }

当我运行这个时,它在这一行给出了System.WhosebugException(我知道,很合适):

    Form1 form1 = new Form1();

我做错了什么?我如何解决它?我可以做些什么来提高代码质量?

第一行错了:

  public partial class Form1 : Form {
    Form1 form1 = new Form1(); // <- this one

您正在创建 Form1 实例,但是 Form1 应该初始化 Form1 form1 字段,该字段又会创建 Form1 实例,它有自己的 Form1 form1正在初始化...

你的 Form1 class 里面有一个 属性 Form1。它会导致无限循环。

所以你应该改变:

public partial class Form1 : Form
{
    Form1 form1 = new Form1();
    public Form1()
    {
        InitializeComponent();

    }...

public partial class Form1 : Form
{  
    public Form1()
    {
        InitializeComponent();

    }...

你的问题在第一行:

public partial class Form1 : Form
{
    Form1 form1 = new Form1();

这条线应该做什么?

当您创建 Form1 的实例时,它的成员会被初始化。您在这里声明了一个成员 form1,它通过创建 Form1.

的新实例进行初始化

当您创建 Form1 的实例时,它的成员会被初始化。您在这里声明了一个成员 form1,它通过创建 Form1.

的新实例进行初始化

当您创建 Form1 的实例时,它的成员会被初始化。您在这里声明了一个成员 form1,它通过 创建 Form1.

的新实例进行初始化

当您创建 Form1 的实例时,它的成员会被初始化。您在这里声明了一个成员 form1,它通过 创建 Form1.

的新实例进行初始化

当您创建 Form1 的实例时,它的成员会被初始化。您在这里声明了一个成员 form1,它由 CREATING A NEW INSTANCE OF Form1.

初始化

WhosebugException

因为您递归地调用了 Form1 的构造函数,所以您的调用堆栈最终运行满了。

Form2也是如此。


结论:从您的 Form1 class 中删除这一行(以及 Form2 中的这一行),反正您不需要它。

作为另一个答案状态,Form1和Form2在构造新实例时都创建了自己的实例。看起来你想要一个单身人士。要实现此目的,请像这样更改您的代码

//From
public Form1 = new Form1()
//To
public static Form1 = new Form1();

一旦第一次引用 Form1 class,这将创建一个 Form 的实例。所以 Form1.Form1 会自动创建一个实例。