2016-06-17 3 views
0

Я пытаюсь создать меню для игры, которую я разрабатываю. Это исходный код:System.StackOverflowException при переключении между формами

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

Что я делаю неправильно? Как это исправить? Что я могу сделать, чтобы улучшить качество кода?

ответ

0

Как и в другом состоянии ответа, Form1 и Form2 создают экземпляр самих себя при создании нового экземпляра. Похоже, вам нужен синглтон. Для достижения этой цели изменить ваш код так

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

Это создаст экземпляр формы, как только Form1 класса ссылается впервые. Таким образом Form1.Form1 автоматически создаст один экземпляр.

+0

Спасибо, он решил проблему. Однако, когда я переключаюсь между формами, первый закрывается, вы считаете, что приложение разбилось, но затем появляется другая форма. Как я могу это решить? – aPlutonicCoder

+0

Примите мой ответ, а затем разместите свой код в новом вопросе и разместите ссылку в этих комментариях. –

2

Это очень первая линия, что это неправильно:

public partial class Form1 : Form { 
    Form1 form1 = new Form1(); // <- this one 

Вы создаете Form1 экземпляр, но Form1 должен инициализировать Form1 form1 поле, которое в свою очередь создает Form1 экземпляр с его собственным Form1 form1 быть инициализированы .. .

+0

Это, для меня, звучит как вторая строка. –

1

У вас есть свойство Form1 внутри вашего класса Form1. Это вызывает бесконечный цикл.

Таким образом, вы должны изменить:

public partial class Form1 : Form 
{ 
    Form1 form1 = new Form1(); 
    public Form1() 
    { 
     InitializeComponent(); 

    }... 

в

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 

    }... 
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

, потому что вы recursivly вызвать конструктор Form1 и поэтому ваш стек вызовов в конечном счете работает полностью.

То же самое касается Form2.


Вывод: удалить эту строку из вашего Form1 класса (и один из Form2), вам не нужно в любом случае.

+2

то же самое применимо к 'Form2'! – klappvisor

+1

@klappvisor да, забыл добавить это, сделал это сейчас. –

+0

** Предупреждение **: этот ответ может вызвать исключение StackOverflowException, если OP продолжает инициализировать экземпляры Form1. –

Смежные вопросы