当我尝试在表单类中创建表单类的对象时,它会在发生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;
            }
        }
    }
}
}
创建Form1的实例将导致f1属性使用Form1的实例进行初始化,这将导致使用Form1的实例初始化f1属性,这将导致使用Form1的实例初始化f1属性,这将导致要使用Form1实例初始化的f1属性,该实例将导致使用Form1实例初始化f1属性,这将导致使用Form1实例初始化f1属性,这将导致f1属性使用实例初始化Form1的一个实例将导致f1属性初始化,这将导致f1属性初始化为Form1的实例,这将导致f1属性初始化为Form1的实例,这将导致f1属性初始化使用Form1的实例会导致f1属性使用Form1的实例初始化,这将导致f1属性初始化为Form1的实例,这将... Stack Overflow!
在类中的方法中,'f1'将是本地的,并且仅在调用的生命周期中存在.除非您在实例化的Form1上调用相同的方法,否则不会创建后续的Form1.
创建 Form1 时,您正在创建 Form1 的私有实例,因此这是一种无限循环:
在代码中的某个位置,您创建了第一个 Form1 实例。创建此实例时,它会创建 Form1 的新实例。该实例还创建了 Form1 的实例,然后又创建了一个实例,等等。
因此,当创建实例时,所有变量都会被初始化,并且当您像这样声明它们时:
Form1 f1 = new Form1()这会自动实例化表单的新实例。
我建议您在 Form1 中没有 Form1 的新实例,但如果您确实需要它,请创建一个方法来创建该实例:
将 更改Form1 f1 = new Form1();为Form1 f1;. 并创建一个方法:
public void InstantiateNewForm1Instance() 
{
    f1 = new Form1();
}
但是:不要在构造函数中调用此方法!否则你也会遇到同样的问题:-)
| 归档时间: | 
 | 
| 查看次数: | 809 次 | 
| 最近记录: |