2016-12-11 3 views
0

Когда я создаю новую вещь из класса MyClass, она вызывает исключение.создание нового объекта вызывает исключение C#

namespace class_test 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
    { 
     InitializeComponent(); 
    } 

    MyClass thing = new MyClass(); 

    private void button1_Click(object sender, EventArgs e) 
    { 
     textBox1.Text = thing.x.ToString(); 
     thing.x++; 
    } 
} 

код класса:

namespace debugging_class 
{ 
    class MyClass : Form1 
    { 
     public int x = 100; 
    } 
} 

По тестирования я обнаружил, что : Form1 из кода класса является проблемой. Я использую это, потому что хочу получить доступ к объектам Form1 в классе. Есть ли способ сделать это без использования : Form1?

+0

Какое исключение и какая линия увольняет его? – Abion47

+1

System.StackOverflowException в строке с 'MyClass thing = new MyClass();' –

+4

Это исключение распространено в случаях бесконечной рекурсии. Вы вызываете 'new MyClass()' внутри конструктора MyClass'? – Abion47

ответ

1

Проблема действительно является одной из бесконечных рекурсий. Когда вы создаете объект MyClass, он вызывает конструктор для этого класса. Поскольку MyClass наследует от Form1, и вы не указали конструктор по умолчанию (без параметров) для MyClass, он неявно вызовет конструктор для Form1.

Проблема в том, что у вас есть в коде для Form1 переменная уровня класса со значением по умолчанию. Когда класс имеет поле со значением по умолчанию, эти переменные будут неявно заданы с заданным значением в начале конструктора этого объекта. Так, например, код:

public class SomeClass 
{ 
    public int i = 5; 

    public SomeClass() 
    { 
     // Just a simple call and that's it 
     Console.WriteLine(i); 
    } 
} 

будет компилировать в нечто, напоминающее следующее:

public class SomeClass 
{ 
    public int i; 

    public SomeClass() 
    { 
     // Assign default values to class instance fields 
     i = 5; 

     // Execute the rest of the constructor code 
     Console.WriteLine(i); 
    } 
} 

Так вот проблема - ваш Form1 класс имеет MyClass поле со значением по умолчанию new MyClass() , Это поле будет назначено в конструкторе Form1. Поскольку MyClass наследует от Form1, тогда будет вызван конструктор Form1, который затем создаст новый экземпляр MyClass, который снова вызовет конструктор для Form1 ... Вы видите, как это превращается в бесконечную рекурсию? Конструкторы Form1 и MyClass звонят друг другу взад и вперед навсегда и всегда (или, по крайней мере, до тех пор, пока программа не достигнет предела рекурсии и не выбросит исключение StackOverflowException).

Причина, по которой ваш код работает нормально, если вы удаляете значение по умолчанию и вместо этого помещаете его в отдельный метод, потому что этот метод не будет вызван дольше в вашей программе. Конструктор MyClass вызовет конструктор Form1, а затем вернется, что позволит вашей программе продолжить свой весёлый путь.

+0

Я получаю то, что вы говорите, но позже в моем проекте я хочу иметь доступ к объекту, например TextBox из Form1 в MyClass. Как мне это сделать? –

+0

@JohnDoe Зачем вам нужно создавать MyClass для этого? Почему бы просто не использовать 'Form1'? – Abion47

Смежные вопросы