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

时间:2016-06-17 11:32:29

标签: 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();

    }
    }
    }

然后我有:

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

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

4 个答案:

答案 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会自动创建一个实例。