1. Вступ
Чому NRT потрібно вмикати окремо?
Nullable Reference Types (NRT) — це не просто синтаксичний цукор, а серйозний помічник компілятора у боротьбі з помилками, пов’язаними з null. Проте з історичних причин цей режим не увімкнено за замовчуванням у старих проєктах — аби не порушити сумісність. Якщо ви створюєте новий проєкт у в останніх версіях .NET (наприклад, .NET 7, 8 або 9), то NRT, найімовірніше, уже увімкнено автоматично. Але якщо проєкт старий або ви хочете керувати цим режимом вручну, це потрібно зробити явно.
Що робить режим Nullable Reference Types?
Коли цей режим активний, компілятор аналізує, які посилальні змінні можуть дорівнювати null, а які — ні. Він не втручається у виконання програми, проте активно видає попередження, якщо бачить можливу помилку. Це дієвий спосіб писати надійний, зрозумілий і стабільний код.
Як дізнатися, чи увімкнено режим NRT?
Якщо у вас новий проєкт .NET 6 або новіший, найімовірніше, NRT уже увімкнено. Але буває по-різному. Перевірмо!
- Відкрийте файл проєкту. Зазвичай це файл із розширенням .csproj.
- Знайдіть або додайте налаштування <Nullable> всередині першого тегу <PropertyGroup>.
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>
Якщо там написано <Nullable>disable</Nullable>, це означає, що контроль NRT вимкнено.
2. Як увімкнути режим NRT
Через .csproj — для всього проєкту
- Відкрийте (або створіть) файл .csproj.
- Всередині блоку <PropertyGroup> додайте або змініть рядок:
<Nullable>enable</Nullable>
Тепер компілятор уважно стежитиме за всіма .cs-файлами у проєкті й попереджатиме про потенційно небезпечні звернення до null.
Навіщо так робити?
Це глобальне налаштування. Відтепер увесь проєкт працює за новими правилами: null — під підозрою, а недбалість більше не пройде!
Тільки для окремих файлів або частин коду
Якщо ви поки не готові вмикати суворий режим для всього проєкту, можна потренуватися на окремих файлах. Для цього використовуються директиви препроцесора:
#nullable enable
string? value = null; // Тут аналіз увімкнено
#nullable disable
string legacyValue = null; // А тут — вже ні
#nullable restore
- #nullable enable — вмикає перевірку до кінця файлу.
- #nullable disable — вимикає її.
- #nullable restore — повертає налаштування з .csproj або зовнішнього файлу.
Це зручно: можна вмикати суворий контроль у нових модулях, не чіпаючи старий, нестабільний код.
Що ще можна вказати в <Nullable>
| Значення | Поведінка |
|---|---|
|
Вмикає все: анотації та попередження |
|
Повністю вимикає аналіз null-посилань |
|
Тільки попередження, без обовʼязкових анотацій |
|
Анотації потрібні, але компілятор не сваритиметься |
|
Повертає поведінку до початкової (наприклад, з глобального налаштування) |
Зазвичай використовують enable або disable.
3. Демонстрація на прикладі
До увімкнення NRT
// Старий режим, NRT вимкнено
string s = null; // Жодних скарг
Console.WriteLine(s.Length); // Небезпечно! Можливий NullReferenceException
Після увімкнення NRT
// Новий режим, NRT увімкнено
string s = null; // Warning: можливе присвоєння null
Console.WriteLine(s.Length); // Warning: можливе звернення до null
Тепер IDE підкреслюватиме потенційні проблеми, а компілятор попередить: Dereference of a possibly null reference. (CS8602)
Як це виправити?
string? s = null;
if (s != null)
{
Console.WriteLine(s.Length);
}
Так ви явно зазначаєте: ця змінна може бути null, і компілятор задоволений.
4. Що робити, якщо проєкт написаний «по-старому»?
Багато проєктів писалися в часи, коли null був майже в кожній посилальній змінній. Увімкнувши NRT, ви ніби наймаєте суворого ревізора, який повідомлятиме про кожну потенційну проблему.
А якщо попереджень забагато?
Не панікуйте — це не помилки, а лише підказки. Програма все одно компілюється.
- Можна вмикати NRT лише в нових файлах.
- Поступово приводьте код до ладу: додавайте ?, робіть перевірки на null, використовуйте ! (про це далі).
- Памʼятайте: чим акуратніше ви працюєте з null, тим менше проблем потім.
Зворотна сумісність і сторонні бібліотеки
- Увімкнення NRT не змінює поведінку коду під час виконання, лише додає аналіз на етапі компіляції.
- Старий код може одразу видати багато попереджень.
- Якщо ви використовуєте бібліотеки без NRT-нотацій, компілятор поводитиметься обережно і припускатиме, що все може бути null.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ