using System;
class Base
{
public Base()
// У конструкторі базового класу викликається віртуальний метод.
// Він виконається *до того*, як виконається конструктор похідного класу.
Initialise(); // ← небезпечно
}
// Віртуальний метод - потенційна точка розширення
protected virtual void Initialise() { }
class Derived: Base
private readonly string _message;
// Делеґувальний ланцюжок: спершу викликається Base(),
// потім управління повертається сюди.
public Derived(string msg) : base()
_message = msg; // ← ініціалізація поля відбувається занадто пізно
// Перевизначаємо віртуальний метод: він посилається на поле,
// яке ще не встигло ініціалізуватись.
protected override void Initialise()
// На момент виклику Base() поле _message ще == null.
// Отримаємо NullReferenceException або «битий» стан.
Console.WriteLine(_message.Length);
class Program
static void Main()
// Кине NullReferenceException у Derived.Initialise()
var d = new Derived("Привіт, світе");