По порядку Middle ООП в C# обновлено

Порядок инициализации при создании наследника

Вопрос

Расставьте по порядку, что выполняется при первом вызове new Derived() (у обоих классов есть статические конструкторы, инициализаторы полей и конструкторы экземпляра; инициализаторы Derived не обращаются к статическим членам Base).

Попробуйте сами

Расставьте шаги по порядку стрелками.

  1. 1
    Статический конструктор Derived
  2. 2
    Инициализаторы полей Derived
  3. 3
    Тело конструктора Base
  4. 4
    Тело конструктора Derived
  5. 5
    Инициализаторы полей Base
  6. 6
    Статический конструктор Base
Показать ответ и разбор

Коротко

Статический конструктор Derived срабатывает перед созданием его экземпляра. Затем выполняются инициализаторы полей Derived: в C они идут до вызова базового конструктора.

Правильный порядок

  1. 1
    Статический конструктор Derived
  2. 2
    Инициализаторы полей Derived
  3. 3
    Статический конструктор Base
  4. 4
    Инициализаторы полей Base
  5. 5
    Тело конструктора Base
  6. 6
    Тело конструктора Derived

Разбор

Статический конструктор Derived срабатывает перед созданием его экземпляра. Затем выполняются инициализаторы полей Derived: в C# они идут до вызова базового конструктора. Когда управление доходит до конструктора Base, среда выполнения впервые обращается к типу Base и запускает его статический конструктор, потом инициализаторы полей Base. Тела конструкторов выполняются от базы к наследнику. Порядок статических конструкторов сдвинется, если инициализаторы Derived раньше обратятся к статическому члену Base. В Java иначе: инициализаторы полей наследника выполняются после базового конструктора, а статика базового класса инициализируется первой.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме