исключение stackoverflow в классе формы - PullRequest
6 голосов
/ 21 июля 2010

Когда я пытаюсь создать объект класса формы в классе формы, он вызывает исключение, поскольку stackoverflow происходит. Однако, когда я объявляю объект класса формы в методе, он работает нормально. Код выглядит следующим образом :

namespace WindowsFormsApplication6
{
    public partial class Form1 : Form
    {   

        **Form1 f1 = new Form1();**//gives stackoverflow exception.......

         char[] ar = new char[15];
        int flag = 0, end;
        double val1, val2, res;
        string oprt;
        public Form1()
        {
            InitializeComponent();
        }

        private void masters(object sender, EventArgs e)
        {
            ar[i] = char.Parse(((Button)sender).Text);
            if (char.IsDigit(ar[i]))
            {
                if (flag != 0)
                {
                    if (textBox1.Text == oprt)
                    {
                        textBox1.Clear();
                    }

                }
                else
                {
                    if (end == 1)
                    {
                        textBox1.Clear();
                        end = 0;
                    }
                }
                Button ansbox = sender as Button;
                textBox1.Text += ansbox.Text;

            }
            else if (char.IsSymbol(ar[i]))
            {
                if (textBox1.TextLength != 0)
                {
                    val1 = double.Parse(textBox1.Text);
                    textBox1.Clear();
                    Button bt = sender as Button;
                    if (bt != null)
                        textBox1.Text = bt.Text;
                    oprt = bt.Text;
                    // dot.Enabled = true;
                    flag = 1;
                }
            }
        }





        private void button14_Click(object sender, EventArgs e)
        {
            if (textBox1.TextLength != 0)
            {
                val2 = double.Parse(textBox1.Text);
                switch (oprt)
                {
                    case "+": res = val1 + val2;
                        break;
                    case "-": res = val1 - val2;
                        break;
                    case "*": res = val1 * val2;
                        break;
                    case "/": res = val1 / val2;
                        break;
                }


                textBox1.Text = res.ToString();
                flag = 0;
                end = 1;
            }
        }
    }
}

}

Ответы [ 7 ]

6 голосов
/ 21 июля 2010

Создание экземпляра Form1 приведет к инициализации свойства f1 с экземпляром Form1, что приведет к инициализации свойства f1 с экземпляром Form1, что приведет к инициализации свойства f1 с экземпляром Form1, который приведет к тому, что свойство f1 будет инициализировано с экземпляром Form1, что приведет к инициализации свойства f1 с экземпляром Form1, что приведет к инициализации свойства f1 с экземпляром Form1, что приведет к инициализации свойства f1 с экземпляром Form1, который будет вызывать инициализацию свойства f1, с экземпляром Form1, который будет инициализировать свойство f1 с экземпляром Form1, что приведет к инициализации свойства f1 с экземпляром Form1, что вызовет свойство f1 инициализируется экземпляром Form1, что приведет к инициализации свойства f1 экземпляром Form1, что вызовет свойство f1 быть инициализированным экземпляром Form1, который ... Переполнение стека!

Внутри метода в классе 'f1' будет локальным и будет существовать только в течение жизни вызова. Если вы не вызовете тот же метод в экземпляре Form1, тогда не будет создано последующих Form1.

4 голосов
/ 21 июля 2010

Вы создаете частный экземпляр Form1 при создании Form1, так что это своего рода бесконечный цикл:

Где-то в вашем коде вы создаете свой первый экземпляр Form1. Когда этот экземпляр создается, он создает новый экземпляр Form1. Этот экземпляр также создает экземпляр Form1 и снова, и снова и т. Д.

Итак, когда создается экземпляр, все переменные инициализируются, и когда вы объявляете их следующим образом: Form1 f1 = new Form1() это автоматически устанавливает новый экземпляр формы.

Я предлагаю, чтобы у вас не было нового экземпляра вашей Form1 внутри Form1, но если вам действительно это нужно, создайте метод для создания экземпляра:

Измените Form1 f1 = new Form1(); на Form1 f1;. И создайте метод:

public void InstantiateNewForm1Instance() 
{
    f1 = new Form1();
}

Но: НЕ НАЗЫВАЙТЕ ЭТОТ МЕТОД В КОНСТРУКТОРЕ! Или у вас будет такая же проблема: -)

2 голосов
/ 21 июля 2010

Это потому, что каждый раз, когда вы создаете экземпляр своего класса, он создает другой экземпляр вашего класса и так далее ... и так далее ... и так далее ...

Другими словамиу вас есть бесконечная рекурсия, когда вы пытаетесь создать экземпляр своего класса.

Вам необходимо добавить какой-то контроль над тем, будет ли создан новый экземпляр Form1 во время создания.Простое (и не полное) решение будет выглядеть примерно так:

public partial class Form1 : Form
{
    Form1 f1;

    public Form1() : this(false)

    public Form1(bool createNewInstance)
    {
        if(createNewInstance)
            f1 = new Form1();
        else
            f1 = null;
    }
}
1 голос
/ 21 июля 2010

Если вы находитесь в новом конструкторе Form1, экземпляр Form1 уже создается.Итак, до того, как он закончен, вы создаете другого, затем тот делает то же самое.Перед загрузкой вашей программы в стеке собирается слишком много форм ... переполняет стек.

1 голос
/ 21 июля 2010

Может быть, потому что Form1 пытается создать экземпляр другой Form1, которая, в свою очередь, пытается создать экземпляр другой Form1 и т. Д.

1 голос
/ 21 июля 2010

Создание экземпляра формы, затем обработка частных полей, создание экземпляра формы form1, создание экземпляров закрытых полей (поиск form1), создание экземпляра этого объекта и обработка закрытых полей, продолжение продолжается.

Вот почему это происходит, тогда как в методе метод выполняется только при вызове, без внутренней инициализации.

Почему, когда в форме form1 вам нужен другой экземпляр той же формы?

0 голосов
/ 21 июля 2010

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

Вы можете увидеть это более четко, пытаясь нарисовать объекты налист бумаги, имитирующий пространство, которое они занимают в памяти, и пространство, занимаемое их детьми - но помните, что каждая форма 1 должна быть одинакового размера!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...