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 会自动创建一个实例。
我正在尝试为我正在开发的游戏创建菜单。这是源代码:
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 会自动创建一个实例。