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