исключение stackoverflow в классе формы

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

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

}
6
задан Brian Mains 21 July 2010 в 14:58
поделиться

7 ответов

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

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

6
ответ дан 8 December 2019 в 15:58
поделиться

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

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

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

public partial class Form1 : Form
{
    Form1 f1;

    public Form1() : this(false)

    public Form1(bool createNewInstance)
    {
        if(createNewInstance)
            f1 = new Form1();
        else
            f1 = null;
    }
}
2
ответ дан 8 December 2019 в 15:58
поделиться

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

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

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

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

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

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

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

4
ответ дан 8 December 2019 в 15:58
поделиться

Форма инстанцируется, затем она обрабатывает приватные поля, которые инстанцируют форму form1, которая затем инстанцирует приватные поля (находя форму form1), которая затем инстанцирует этот объект и обрабатывает приватные поля, продолжая далее.

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

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

1
ответ дан 8 December 2019 в 15:58
поделиться

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

1
ответ дан 8 December 2019 в 15:58
поделиться

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

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

0
ответ дан 8 December 2019 в 15:58
поделиться

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

1
ответ дан 8 December 2019 в 15:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: