2010-07-21 18 views
6

Cuando intento crear un objeto de la clase de formulario dentro de la clase de formulario, se produce una excepción al ocurrir stackoverflow. Sin embargo, cuando declaro el objeto de clase de formulario dentro de un método, funciona bien. el código es el siguiente:excepción stackoverflow en la clase de formulario

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

+1 stackoverflow ¡excepción! – Fabian

Respuesta

4

Estás creando una instancia privada de Form1 cuando se crea Form1 así que esto es una especie de bucle sin fin:

en algún lugar de su código a crear su primera instancia Form1. Cuando esta instancia está creando, crea una nueva instancia de Form1. Este ejemplo también crea una instancia de Form1 y otra vez, y otra vez, etc.

Así que cuando se crea una instancia todas las variables se inicializan y cuando se declaran así: Form1 f1 = new Form1() este instatiates automaticamente una nueva instancia del formulario.

Yo sugeriría que no tiene una nueva instancia de Form1 dentro de su Form1 pero si realmente necesita este crear un método para hacer la instancia:

Cambiar el Form1 f1 = new Form1(); en Form1 f1;. y crear un método:

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

Pero: NO llamar a este método en el constructor! O bien, tendrá el mismo problema :-)

1

El formulario se crea una instancia, luego procesa los campos privados, lo que ejemplifica el formulario1, que luego instancia los campos privados (encontrando form1), que luego instancia ese objeto y procesa los campos privados, continuando.

Por eso sucede eso, mientras que, en un método, un método solo se ejecuta cuando se llama, sin inicialización interna.

¿Por qué, cuando está en form1, necesita otra instancia de la misma forma?

+2

Erm ... locura? – Lazarus

2

Eso es porque cada vez que se crea una instancia de la clase, se crea otra instancia de la clase y así sucesivamente ... y así sucesivamente ... y así sucesivamente ...

En otras palabras, tener una recursión infinita cuando intentes crear una instancia de tu clase.

Necesita agregar algún tipo de control sobre si se crea o no una nueva instancia de Form1 en el momento de la construcción. Una solución simple (y no completa) sería algo así como:

public partial class Form1 : Form 
{ 
    Form1 f1; 

    public Form1() : this(false) 

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

Podría ser porque Form1 está tratando de crear una instancia de otra Form1 que a su vez está tratando de crear una instancia de otra Form1 etc?

0

Si cada clase Form1 contiene una nueva instancia de una clase Form1, es probable que tenga una excepción de desbordamiento de pila al intentar crear una.

Puede verlo más claramente tratando de dibujar los objetos en una hoja de papel, simulando el espacio que ocupan en la memoria y el espacio ocupado por sus hijos, pero recuerde que ¡cada Forma 1 debe ser del mismo tamaño!

6

La creación de una instancia de Form1 provocaría la inicialización de la propiedad f1 con una instancia de Form1 que provocaría la inicialización de la propiedad f1 con una instancia de Form1 que provocaría la inicialización de la propiedad f1 con una instancia de Form1 que causaría que la propiedad f1 se inicializara con una instancia de Form1 que causaría que la propiedad f1 se inicializara con una instancia de Form1 que causaría que la propiedad f1 se inicializara con una instancia de Form1 que causaría que la propiedad f1 fuera se inicializó con una instancia de Form1 que provocaría que la propiedad f1 se inicializara con una instancia de Form1 que provocaría que la propiedad f1 se inicializara con una instancia de Form1 que provocaría que la propiedad f1 se inicializara con una instancia de Form1 que generaría causa que la propiedad f1 se inicialice con una instancia de F orm1 que causaría la inicialización de la propiedad f1 con una instancia de Form1 que provocaría que la propiedad f1 se inicializara con una instancia de Form1 que ... Stack Overflow!

Dentro de un método en la clase, el 'f1' sería local y solo existiría mientras dure la llamada. A menos que haya llamado al mismo método en el Form1 instanciado, no se crearán Form1s posteriores.

1

Si está en el nuevo constructor de Form1, ya se está creando una instancia de Form1. Entonces, antes de que termine de crearse, estás creando otro, entonces ese hace lo mismo. Antes de que se cargue tu programa, demasiados form1s van en la pila ... desbordando la pila.

Cuestiones relacionadas