2010-07-21 16 views
6

Quando si tenta di creare un oggetto della classe form all'interno della classe form, viene fornita un'eccezione quando si verifica uno stackoverflow. Tuttavia, quando dichiaro l'oggetto della classe form all'interno di un metodo, funziona correttamente. il codice è il seguente:eccezione stackoverflow nella classe modulo

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

Eccezione stackoverflow +1! – Fabian

risposta

4

stai creando un'istanza privata di Form1 quando viene creato Form1 quindi questo è una sorta di un ciclo infinito:

da qualche parte nel codice si crea la prima istanza Form1. Quando questa istanza viene creata crea una nuova istanza di Form1. Questa istanza crea anche un'istanza di Form1 e ancora, e ancora, ecc

Così, quando viene creata un'istanza tutte le variabili sono inizializzate e quando vengono dichiarate in questo modo: Form1 f1 = new Form1() questo instatiates automaticly una nuova istanza del modulo.

vi suggerisco di non si dispone di una nuova istanza della vostra Form1 all'interno del vostro Form1, ma se si ha realmente bisogno di questo creare un metodo per rendere l'istanza:

Modificare il Form1 f1 = new Form1(); in Form1 f1;. E creare un metodo:

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

Ma: NON chiamare questo metodo nel costruttore! Oppure si avrà lo stesso problema :-)

1

Il modulo viene istanziato, quindi elabora i campi privati, che istanziano il modulo1, che quindi istanzia i campi privati ​​(trovare form1), che quindi istanzia quell'oggetto e i processi i campi privati, proseguendo.

Ecco perché succede, mentre, in un metodo, un metodo viene eseguito solo quando chiamato, senza inizializzazione interna.

Perché, quando in form1, hai bisogno di un'altra istanza dello stesso modulo?

+2

Erm ... follia? – Lazarus

2

Ecco perché ogni volta che si crea un'istanza della classe, si crea un'altra istanza della classe e così via ... e così via ... e così via ...

In altre parole, si avere una ricorsione infinita quando provi a creare un'istanza della tua classe.

È necessario aggiungere un qualche tipo di controllo sull'opportunità o meno di creare una nuova istanza di Form1 in fase di costruzione. Una soluzione semplice (e non completa) sarebbe qualcosa di simile:

public partial class Form1 : Form 
{ 
    Form1 f1; 

    public Form1() : this(false) 

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

Potrebbe essere perché Form1 sta cercando di creare un'istanza di un'altra Form1 che a sua volta sta cercando di creare un'istanza di un'altra Form1 ecc?

0

Se ogni classe Form1 contiene una nuova istanza di una classe Form1, è necessario che si verifichi un'eccezione di overflow dello stack durante il tentativo di crearne una.

Puoi vederlo più chiaramente cercando di disegnare gli oggetti su un foglio di carta, simulando lo spazio che occupano nella memoria e lo spazio occupato dai loro figli - ma ricorda, ogni modulo 1 deve essere della stessa dimensione!

6

La creazione di un'istanza di Form1 causerebbe l'inizializzazione della proprietà f1 con un'istanza di Form1 che causerebbe l'inizializzazione della proprietà f1 con un'istanza di Form1 che causerebbe l'inizializzazione della proprietà f1 con un'istanza di Form1 che causerebbe l'inizializzazione della proprietà f1 con un'istanza di Form1 che causerebbe l'inizializzazione della proprietà f1 con un'istanza di Form1 che causerebbe l'inizializzazione della proprietà f1 con un'istanza di Form1 che causerebbe la proprietà f1 inizializzato con un'istanza di Form1 che causerebbe l'inizializzazione della proprietà f1 con un'istanza di Form1 che causerebbe l'inizializzazione della proprietà f1 con un'istanza di Form1 che causerebbe l'inizializzazione della proprietà f1 con un'istanza di Form1 che causa l'inizializzazione della proprietà f1 con un'istanza di F orm1 che causerebbe l'inizializzazione della proprietà f1 con un'istanza di Form1 che causerebbe l'inizializzazione della proprietà f1 con un'istanza di Form1 che ... Stack Overflow!

All'interno di un metodo della classe, "f1" è locale e esiste solo per la durata della chiamata. A meno che non abbiate chiamato lo stesso metodo sul Form1 istanziato, non ci sarebbero i successivi Form1 creati.

1

Se si è nel nuovo costruttore di Form1, viene già creata un'istanza di Form1. Quindi, prima di essere creato, ne stai creando un altro, poi quello fa lo stesso. Prima del caricamento del programma, troppi form1 stanno andando in pila ... traboccando dalla pila.

Problemi correlati