Страницы

Поиск по вопросам

пятница, 20 декабря 2019 г.

Stackoverflow Exception при инициализации базового класса, в чем проблема?

#c_sharp #исключения


Выдает исключение StackOverflowException при такой конструкции:

private void button1_Click(object sender, EventArgs e)
{
      // Инициализация базового класса
      var a = new A(); <<< тут исключение
}

private class A
{
      public B b = new B();
      public C c = new C();
}

private class B : A
{

}

private class C : A
{

}


Почему?
    


Ответы

Ответ 1



Для начала, в Вашем случае, объявление полей класса с их немедленной инициализацией private class A { public B b = new B(); public C c = new C(); } компилятор превращает в private class A { public B b; public C c; public A() { b = new B(); c = new C(); } } Т.е. если вы явно не создаете конструктор, то за Вас его создат компилятор и добавит туда инициализацию этих полей. Теперь давайте посмотрим что будет происходить при создании экземпляра класса A. При создании эземпляра вызывается конструктор по умолчанию, в котором инициализируется два поля b = new B() и c = new C(). B и C наследуются от A и, соответственно (т.к. Вы не указали конструктор для них) вызывается родительский контсруктор по умолчанию, в котором, опять же, инициализируются эти два поля (точнее скорее всего до инициализации c дело даже не дойдет, т.к. все свалится на инициализации b, но не уверен). Таким образом мы падаем в бесконечную инициализацию и получаем StackoverflowException

Комментариев нет:

Отправить комментарий