2010-07-21 12 views
6

Wenn ich versuche, ein Objekt der Formularklasse innerhalb der Formularklasse zu erstellen, gibt es eine Ausnahme als Stackoverflow aufgetreten.Wenn ich jedoch das Objekt der Formularklasse innerhalb einer Methode deklarieren, funktioniert es einwandfrei. der Code ist wie folgt:stackoverflow Ausnahme in Formularklasse

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 Ausnahme! – Fabian

Antwort

4

Sie eine private Instanz von Form1 erstellen, wenn Form1 erstellt wird, so dass diese Art von einer endlos-Schleife ist:

Irgendwo in Ihrem Code Sie Ihre erste Form1-Instanz erstellen. Wenn diese Instanz erstellt wird, wird eine neue Instanz von Form1 erstellt. Diese Instanz auch eine Instanz von Form1 erstellt und wieder und wieder usw.

So, wenn eine Instanz erstellt wird, werden alle Variablen initialisiert und wenn Sie sie wie folgt erklären: Form1 f1 = new Form1() diese instatiates automatisch eine neue Instanz des Formulars.

Ich schlage vor, Sie nicht über eine neue Instanz des Form1 in Ihrem Form1 haben, aber wenn Sie wirklich brauchen diese ein Verfahren zu schaffen, um die Instanz zu machen:

Ändern Sie den Form1 f1 = new Form1(); in Form1 f1;. und erstellen Sie eine Methode:

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

Aber: diese Methode nicht in Konstruktoraufruf! Oder sonst haben Sie das gleiche Problem :-)

1

Das Formular wird instanziiert, dann verarbeitet es die privaten Felder, die das Formular1 instanziiert, das dann die privaten Felder instanziiert (form1), die dann dieses Objekt und Prozesse instanziiert die privaten Felder, weiter.

Deshalb ist das der Fall, während in einer Methode eine Methode nur ausgeführt wird, wenn sie aufgerufen wird, keine interne Initialisierung.

Warum brauchen Sie in form1 eine andere Instanz desselben Formulars?

+2

Erm ... Wahnsinn? – Lazarus

2

Das ist, weil jedes Mal, wenn eine Instanz der Klasse erstellen, ist es eine andere Instanz der Klasse erstellt und so weiter ... und so weiter ... und so weiter ...

Mit anderen Worten: Sie Haben Sie eine unendliche Rekursion, wenn Sie versuchen, eine Instanz Ihrer Klasse zu erstellen.

Sie müssen eine Art Kontrolle hinzufügen, ob eine neue Instanz von Form1 zur Konstruktionszeit erstellt wird.

public partial class Form1 : Form 
{ 
    Form1 f1; 

    public Form1() : this(false) 

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

Könnte es sein, weil Form1 versucht, einen anderen Form1 zu instanziiert, die wiederum versuchen, einen anderen Form1 etc zu instanziiert: Eine einfache (und nicht vollständig) Lösung wäre so etwas wie sein?

0

Wenn jede Form1-Klasse eine neue Instanz einer Form1-Klasse enthält, müssen Sie eine Stapelüberlaufausnahme haben, wenn Sie versuchen, eine zu erstellen.

Sie können es klarer sehen, indem Sie versuchen, die Objekte auf einem Blatt Papier zu zeichnen, die Simulation der Raum, den sie im Speicher und den Raum von ihren Kindern besetzt besetzen - aber denken Sie daran, jede Form 1 muss von der gleichen Größe sein!

6

Das Erstellen einer Instanz von Form1 würde dazu führen, dass die Eigenschaft f1 mit einer Instanz von Form1 initialisiert wird, wodurch die Eigenschaft f1 mit einer Instanz von Form1 initialisiert wird, wodurch die Eigenschaft f1 mit einer Instanz von Form1 initialisiert wird Dadurch würde die Eigenschaft f1 mit einer Instanz von Form1 initialisiert, wodurch die Eigenschaft f1 mit einer Instanz von Form1 initialisiert würde, wodurch die Eigenschaft f1 mit einer Instanz von Form1 initialisiert würde, die die Eigenschaft f1 verursachen würde initialisiert mit einer Instanz von Form1, die dazu führen würde, dass die Eigenschaft f1 mit einer Instanz von Form1 initialisiert würde, was dazu führen würde, dass die Eigenschaft f1 mit einer Instanz von Form1 initialisiert würde, was dazu führen würde, dass die Eigenschaft f1 mit einer Instanz von Form1 initialisiert würde Veranlassen Sie, dass die Eigenschaft f1 mit einer Instanz von F initialisiert wird orm1, was dazu führen würde, dass die Eigenschaft f1 mit einer Instanz von Form1 initialisiert wird, was dazu führen würde, dass die Eigenschaft f1 mit einer Instanz von Form1 initialisiert wird, die ... Stack Overflow!

Innerhalb einer Methode in der Klasse wäre "f1" lokal und nur für die Lebensdauer des Aufrufs vorhanden. Wenn Sie nicht dieselbe Methode für das instanziierte Form1 aufgerufen haben, werden keine nachfolgenden Form1s erstellt.

1

Wenn Sie sich im neuen Konstruktor von Form1 befinden, wird bereits eine Instanz von Form1 erstellt. Bevor Sie also mit der Erstellung fertig sind, erstellen Sie eine andere, und dann macht es dasselbe. Bevor das Programm geladen wird, gehen zu viele Formulare auf den Stapel ... und überlaufen den Stapel.

Verwandte Themen