1. Giriş
NRT-ni niyə ayrıca qoşmaq lazımdır?
Nullable Reference Types (NRT) — bu sadəcə sintaksis şəkəri deyil, null ilə bağlı səhvlərlə mübarizədə kompilyatorun ciddi köməkçisidir. Amma tarixi səbəblərə görə bu rejim köhnə proyektlərdə avtomatik qoşulmur — uyğunluğu pozmamaq üçün. Əgər sən yeni proyekt yaradırsansa və .NET-in son versiyalarında (.NET 7, 8 və ya 9 kimi), çox güman ki, NRT artıq avtomatik qoşulub. Amma əgər proyekt köhnədirsə və ya bu rejimi əl ilə idarə etmək istəyirsənsə, bunu açıq şəkildə etməlisən.
Nullable Reference Types rejimi nə edir?
Bu rejim aktiv olanda, kompilyator yoxlayır ki, hansı referans dəyişənlər null ola bilər, hansılar yox. O, proqramın icrasına qarışmır, amma potensial səhv görəndə səxavətlə xəbərdarlıqlar verir. Bu, etibarlı, başadüşülən və dayanıqlı kod yazmaq üçün əla üsuldur.
NRT rejiminin qoşulu olub-olmadığını necə bilmək olar?
Əgər səndə yeni .NET 6 və ya yuxarı proyekt varsa, çox güman ki, NRT artıq qoşulub. Amma hər şey ola bilər. Gəlin yoxlayaq!
- Proyekt faylını aç. Adətən bu, .csproj uzantılı fayldır.
- Birinci <PropertyGroup> teqi içində <Nullable> sazlamasını tap və ya əlavə et.
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>
Əgər orada <Nullable>disable</Nullable> yazılıbsa, deməli NRT nəzarəti söndürülüb.
2. NRT rejimini necə qoşmaq olar
.csproj vasitəsilə — bütün proyekt üçün
- .csproj faylını aç (və ya yarat).
- <PropertyGroup> blokunun içində aşağıdakı sətri əlavə et və ya dəyiş:
<Nullable>enable</Nullable>
İndi kompilyator proyektin bütün .cs fayllarına diqqətlə baxacaq və potensial təhlükəli null müraciətlərinə irad bildirəcək.
Niyə belə etmək lazımdır?
Çünki bu qlobal sazlamadır. Bu andan etibarən bütün proyekt yeni qaydalarla işləyir: null — şübhə altındadır və səhlənkarlıq artıq keçməyəcək!
Yalnız ayrı-ayrı fayllar və ya kod hissələri üçün
Əgər hələ bütün proyekt üçün sərt rejimi qoşmağa hazır deyilsənsə, ayrı-ayrı fayllarda məşq edə bilərsən. Bunun üçün preprocessor direktivlərindən istifadə olunur:
#nullable enable
string? value = null; // Burada analiz qoşulub
#nullable disable
string legacyValue = null; // Amma burada — artıq yox
#nullable restore
- #nullable enable — faylın sonuna kimi yoxlamanı qoşur.
- #nullable disable — onu söndürür.
- #nullable restore — sazlamaları .csproj və ya xarici fayldan bərpa edir.
Bu rahatdır: yeni modullarda sərt nəzarəti qoşmaq olar, köhnə, qeyri-sabit koda toxunmadan.
<Nullable> içində başqa nə yazmaq olar
| Dəyər | Davranış |
|---|---|
|
Hər şeyi qoşur: annotasiyalar və xəbərdarlıqlar |
|
null-link analizini tamamilə söndürür |
|
Yalnız xəbərdarlıqlar, annotasiya məcburi deyil |
|
Annotasiya lazımdır, amma kompilyator irad bildirməyəcək |
|
Davranışı ilkin vəziyyətə qaytarır (məsələn, qlobal sazlamadan) |
Adətən enable və ya disable istifadə olunur.
3. Nümunə ilə nümayiş
NRT qoşulmamışdan əvvəl
// Köhnə rejim, NRT söndürülüb
string s = null; // Heç bir irad yoxdur
Console.WriteLine(s.Length); // Təhlükəlidir! NullReferenceException ola bilər
NRT qoşulduqdan sonra
// Yeni rejim, NRT qoşulub
string s = null; // Xəbərdarlıq: null təyin oluna bilər
Console.WriteLine(s.Length); // Xəbərdarlıq: null-a müraciət ola bilər
İndi IDE potensial problemləri vurğulayacaq və kompilyator xəbərdarlıq edəcək: Dereference of a possibly null reference. (CS8602)
Bunu necə düzəltmək olar?
string? s = null;
if (s != null)
{
Console.WriteLine(s.Length);
}
Beləliklə, sən açıq göstərirsən: bu dəyişən null ola bilər və kompilyator razı qalır.
4. Proyekt "köhnə üsulla" yazılıbsa nə etmək lazımdır?
Bir çox proyektlər o dövrdə yazılıb ki, null demək olar hər referans dəyişəndə var idi. NRT-ni qoşanda, sanki ciddi bir yoxlayıcı işə götürürsən ki, hər potensial problemi sənə desin.
Bəs xəbərdarlıqlar çoxdursa?
Panik etmə — bunlar səhv deyil, sadəcə ipuclarıdır. Proqram yenə də kompilyasiya olunur.
- NRT-ni yalnız yeni fayllarda qoşmaq olar.
- Kodu tədricən qaydaya sal: ? əlavə et, null-a yoxlamalar et, ! istifadə et (bunu sonra danışacağıq).
- Unutma: null ilə nə qədər diqqətli işləsən, sonra bir o qədər az problem çıxacaq.
Geri uyğunluq və üçüncü tərəf kitabxanalar
- NRT-nin qoşulması kodun icra davranışını dəyişmir, sadəcə kompilyasiya zamanı analiz əlavə edir.
- Köhnə kod dərhal çoxlu xəbərdarlıq verə bilər.
- Əgər sən NRT-annotasiyası olmayan kitabxanalardan istifadə edirsənsə, kompilyator ehtiyatlı olacaq və hər şeyin null ola biləcəyini düşünəcək.
GO TO FULL VERSION