在表单之间切换时出现System.StackOverflowException

aPl*_*der 0 c# stack-overflow

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

   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();

    }
    }
    }
Run Code Online (Sandbox Code Playgroud)

然后我有:

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();

    }
    }
    }
Run Code Online (Sandbox Code Playgroud)

当我运行它时,它在这一行上给出了一个System.StackOverflowException(我知道,非常合适):

    Form1 form1 = new Form1();
Run Code Online (Sandbox Code Playgroud)

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

Ren*_*ogt 5

你的问题出在第一行:

public partial class Form1 : Form
{
    Form1 form1 = new Form1();
Run Code Online (Sandbox Code Playgroud)

这条线应该做什么?

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

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

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

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

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

StackOverflowException

因为你递归调用构造函数,Form1所以你的调用栈最终会运行完全.

同样的道理Form2.


结论:从你的Form1班级(和那个班级)中删除这一行Form2,你无论如何都不需要它.

  • 这同样适用于`Form2`! (2认同)