C# 在表单之间切换时System.StackOverflowException

C# 在表单之间切换时System.StackOverflowException,c#,stack-overflow,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 Syste

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

   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.StackOverflowException(我知道,非常合适):

    Form1 form1 = new Form1();
我做错了什么?我怎么修理它?我能做些什么来提高代码质量?

第一行是错误的:

  public partial class Form1 : Form {
    Form1 form1 = new Form1(); // <- this one
公共部分类表单1:表单{

Form1 Form1=new Form1();//在
Form1
类中有一个属性
Form1
。它会导致无限循环

所以你应该改变:

public partial class Form1 : Form
{
    Form1 form1 = new Form1();
    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
,该成员通过创建
Form1
的新实例进行初始化

StackOverflowException

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

同样的情况也适用于
Form2



结论:从
Form1
类中删除这一行(以及
Form2
中的那一行),您无论如何都不需要它。

作为另一个应答状态,Form1和Form2在构造新实例时都会创建自己的实例。看起来您需要一个单例。要实现这一点,请按如下方式更改代码

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

这将在Form1类第一次被引用时立即创建表单的实例。因此Form1.Form1将自动创建单个实例。

这同样适用于
Form2
!@klappvisor yep,忘记添加了,现在就添加了。警告:如果操作继续,此答案可能引发StackOverflowException习惯于初始化Form1的实例。对我来说,这听起来像第二行。谢谢,它解决了问题。但是,当我在表单之间切换时,第一行关闭,你认为应用程序崩溃了,但另一个表单出现了。我如何解决这个问题?接受我的答案,然后在新问题中发布代码,并在这些评论中发布链接。
//From
public Form1 = new Form1()
//To
public static Form1 = new Form1();