表单类中的stackoverflow异常

时间:2010-07-21 14:56:37

标签: c# .net winforms

当我尝试在表单类中创建表单类的对象时,它会在发生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 个答案:

答案 0 :(得分:6)

创建Form1的实例会导致f1属性使用Form1的实例进行初始化,这将导致使用Form1的实例初始化f1属性,这将导致使用Form1的实例初始化f1属性。将导致f1属性使用Form1的实例初始化,这将导致f1属性使用Form1的实例初始化,这将导致f1属性使用Form1的实例进行初始化,这将导致f1属性被初始化使用Form1的实例将导致f1属性使用Form1的实例进行初始化,这将导致f1属性使用Form1的实例进行初始化,这将导致f1属性使用Form1的实例初始化,这将导致要使用Form1实例初始化的f1属性,该实例将导致使用Form1实例初始化f1属性,这将导致f1属性用Form1的实例初始化,这将... Stack Overflow!

在类中的方法中,'f1'将是本地的,并且仅在调用的生命周期中存在。除非您在实例化的Form1上调用相同的方法,否则不会创建后续的Form1。

答案 1 :(得分:4)

创建Form1时,您正在创建Form1的私有实例,因此这是一个无限循环:

在代码中的某处,您可以创建第一个Form1实例。 创建此实例时,它将创建Form1的新实例。 此实例还会再次创建Form1的实例,等等。

因此,在创建实例时,所有变量都会被初始化,并且当您像这样声明它们时: Form1 f1 = new Form1()这会自动设置表单的新实例。

我建议你在Form1中没有Form1的新实例,但是如果你真的需要这个,请创建一个方法来创建实例:

Form1 f1 = new Form1();更改为Form1 f1;。 并创建一个方法:

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

但是:不要在构造函数中调用这种方法!否则你会遇到同样的问题: - )

答案 2 :(得分:2)

那是因为每次你创建一个类的实例时,它都会创建你的类的另一个实例,依此类推......等等...

换句话说,当您尝试创建类的实例时,您将获得无限递归。

您需要在构造时是否创建Form1的新实例时添加某种控件。一个简单(而不是完整)的解决方案就像:

public partial class Form1 : Form
{
    Form1 f1;

    public Form1() : this(false)

    public Form1(bool createNewInstance)
    {
        if(createNewInstance)
            f1 = new Form1();
        else
            f1 = null;
    }
}

答案 3 :(得分:1)

表单被实例化,然后它处理私有字段,实例化form1,然后实例化私有字段(查找form1),然后实例化该对象并处理私有字段,继续。

这就是为什么会发生这种情况,而在一个方法中,方法只在被调用时执行,而不是内部初始化。

为什么,在form1中,您是否需要另一个相同形式的实例?

答案 4 :(得分:1)

可能是因为Form1试图实例化另一个Form1,而Form1又试图实例化另一个Form1等?

答案 5 :(得分:1)

如果您在Form1的新构造函数中,则已经创建了Form1的实例。所以,在它完成创建之前,你创建另一个,然后那个做同样的事情。在程序加载之前,堆栈上会出现太多的form1s ......溢出堆栈。

答案 6 :(得分:0)

如果每个Form1类包含一个Form1类的新实例,则在尝试创建一个Form1类时,您将遇到堆栈溢出异常。

你可以通过尝试在一张纸上绘制对象,模拟他们在记忆中占据的空间以及他们孩子占用的空间来更清楚地看到它 - 但请记住,每个Form 1必须具有相同的大小! / p>