我正在尝试为游戏创建一个菜单。正在发展。这是源代码:
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(我知道,非常合适):</ p>
Form1 form1 = new Form1();
我做错了什么?我如何解决它?我可以做些什么来提高代码质量?
答案 0 :(得分:5)
你的问题出在第一行:
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
中的课程中删除此行),无论如何您都不需要它。
答案 1 :(得分:2)
第一行是错误的:
public partial class Form1 : Form {
Form1 form1 = new Form1(); // <- this one
您正在创建Form1
个实例,但Form1
应该初始化Form1 form1
字段,然后创建Form1
个实例并将其Form1 form1
初始化...
答案 2 :(得分:1)
您的Form1
课程中有一个属性Form1
。它会导致无限循环。
所以你应该改变:
public partial class Form1 : Form
{
Form1 form1 = new Form1();
public Form1()
{
InitializeComponent();
}...
到
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}...
答案 3 :(得分:0)
作为另一个回答状态,Form1和Form2都在构造新实例时创建自己的实例。看起来你想要一个单身人士。要实现这一点,请更改您的代码
//From
public Form1 = new Form1()
//To
public static Form1 = new Form1();
首次引用Form1 类时,这将创建Form的实例。所以Form1.Form1会自动创建一个实例。