Підрозділ 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 дає керованому коду

Керований 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# — він є природним середовищем для вивчення об'єктно-орієнтованого програмування і не вимагає турботи про деталі керування пам'яттю.