OOP Course
Сьогодні

Підрозділ 1.3

Керований та некерований код

Розкриває різницю між керованим і некерованим кодом та пояснює, яку роль у безпечному виконанні відіграє CLR.

1.3. Керований та некерований код

Програму, написану на C# для .NET, називають керованим кодом (managed code). Це означає, що її виконання відбувається під контролем CLR — Common Language Runtime. CLR не просто запускає програму: вона завантажує збірки, перевіряє типи, виконує JIT-компіляцію, керує пам'яттю, обробляє винятки і надає інші служби виконання.

Порівняння: керований vs некерований

Порівняння керованого та некерованого коду

Керований код — це код, що компілюється у проміжну мову CIL і виконується під контролем CLR. До керованих мов .NET належать C#, F# і Visual Basic.

Некерований код — це код, виконання якого CLR не контролює. Типові приклади — програми та бібліотеки на C, C++ або Rust, що компілюються безпосередньо у машинний код для конкретної платформи.

Це не означає, що некерований код «гірший». Він необхідний для системного програмування, драйверів, ігрових рушіїв, високопродуктивних бібліотек і роботи з апаратним забезпеченням. Але він вимагає більше дисципліни: програміст сам відповідає за виділення і звільнення пам'яті, безпеку вказівників і управління ресурсами.

Що CLR дає керованому коду

Служби, які CLR надає керованому коду

Керований C#-код автоматично отримує від CLR повний набір служб:

  • JIT-компіляція — CIL перетворюється у машинний код під конкретний процесор під час виконання
  • Garbage Collection — CLR автоматично звільняє пам'ять від об'єктів, що більше не використовуються
  • Перевірка типів — CLR перевіряє коректність операцій над типами; некоректне приведення спричиняє виняток, а не корупцію пам'яті
  • Обробка винятків — єдина модель try/catch/finally для будь-яких помилок виконання
  • Метадані та рефлексія — код може аналізувати власну структуру під час виконання
  • Interop — керований код може викликати нативні бібліотеки через P/Invoke

Порівняння з C++

Щоб краще відчути різницю, порівняємо концептуально роботу з пам'яттю:

У C++ еквівалентний код виглядав би так (псевдокод — не C#):

Patient* p = new Patient("Ivan", 45);  // виділення у купі
// ... використання ...
delete p;   // ОБОВ'ЯЗКОВО звільнити — інакше витік пам'яті

У C# рядок delete просто не існує. CLR відстежує, коли об'єкт стає недосяжним, і прибирає його автоматично. Для студента це означає, що більшість помилок типу «звернення до звільненої пам'яті» або «витік пам'яті» в C# неможливі в принципі.

Взаємодія з некерованим кодом (Interop)

.NET не ізольований від зовнішнього світу. Керований C#-код може викликати функції з нативних бібліотек (.dll на Windows, .so на Linux) через механізм P/Invoke (Platform Invocation Services):

// Виклик нативної Windows API функції з C#
[System.Runtime.InteropServices.DllImport("user32.dll")]
static extern int MessageBox(IntPtr hWnd, string text, string caption, int type);

При переході між керованим і некерованим кодом важливо правильно описати типи і правила виклику. Це відповідальна зона: помилки тут можуть бути складнішими для діагностики, ніж звичайні винятки C#. Для початку курсу interop не потрібен — він з'являється лише у специфічних сценаріях.

Unsafe-код у C#

C# дозволяє писати небезпечний код (unsafe code) — ділянки, де можна працювати з вказівниками безпосередньо. Такий код позначається ключовим словом unsafe:

unsafe
{
    int x = 42;
    int* ptr = &x;          // вказівник на змінну
    Console.WriteLine(*ptr); // розіменування
}

Unsafe-код залишається частиною .NET-програми, але виходить за межі звичайної безпечної моделі CLR. Він потрібен лише для дуже специфічних сценаріїв: high-performance буферів, взаємодії з апаратурою, оптимізацій на рівні байтів.

На початку навчання unsafe-код не потрібен. Навпаки — краще спершу добре засвоїти типи, об'єкти, класи, методи й колекції. До низькорівневих можливостей варто переходити лише тоді, коли зрозуміло, яку конкретну проблему вони розв'язують.

Підсумок

Керований код (C#) Некерований код (C/C++)
Виконання Під контролем CLR Безпосередньо ОС
Пам'ять Автоматично (GC) Вручну (malloc/free)
Безпека типів Гарантується CLR Відповідальність програміста
Продуктивність Висока (JIT-оптимізації) Максимальна (нативний код)
Типові сфери Прикладна розробка, веб, API Системне ПЗ, драйвери, рушії

Для цього курсу ми працюємо виключно з керованим кодом C# — він є природним середовищем для вивчення об'єктно-орієнтованого програмування і не вимагає турботи про деталі керування пам'яттю.

Розроблено Tomka Yurii · © 2026 ·