CodeGym /Kurslar /C# SELF /null ilə işləmək: operatorlar ??, ?., ?, !, default

null ilə işləmək: operatorlar ??, ?., ?, !, default

C# SELF
Səviyyə , Dərs
Mövcuddur

1. null birləşdirmə operatoru (??)

Nullable tiplər haqqında biliklərin, qısa və təhlükəsiz konstruktorlar yazmağı bacarmadan tam olmaz. C#-da bunun üçün iki super faydalı operator var: null birləşdirmə (??)null-şərtli operator (?.).

?? operatoru sənə null ola bilən dəyişən üçün “susmaya görə dəyər” təyin etməyə imkan verir.

Təsəvvür elə, istifadəçi adın var və o null ola bilər. Əgər həqiqətən null olsa, "Qonaq" göstərmək istəyirsən. Misal:

string userName = null;
string displayName = userName != null ? userName : "Qonaq";
null üçün klassik yoxlama

?? operatoru bunu daha qısa yazmağa imkan verir:

string userName = null;
string displayName = userName ?? "Qonaq";
Susmaya görə dəyər üçün ?? istifadəsi

Necə işləyir:

  • Əgər soldakı ifadə null deyilsə, nəticə kimi o qaytarılır.
  • Əgər solda null varsa, sağdakı dəyər istifadə olunur.

Başqa nümunələr:

int? age = null;
int displayAge = age ?? -1; // -1 — susmaya görə dəyər
Console.WriteLine(displayAge); // -1 çap edəcək

string input = null;
string name = input ?? "Qonaq";
Console.WriteLine($"Salam, {name}!"); // Salam, Qonaq!

Operatorların zənciri

?? operatorunu zəncirvari istifadə etmək olar:

string result = str1 ?? str2 ?? "Susmaya görə";
?? operatorlarının zənciri

Əgər str1 null deyilsə, o istifadə olunur. Yox əgər str2null olarsa — "Susmaya görə" sətiri istifadə olunur.

2. Null-şərtli operator (?.)

Tez-tez rast gəlinən başqa bir hal — obyekt null deyilsə, onun metodunu çağırmaq və ya property-sinə müraciət etmək. Misal:

User user = null;
string displayName = user != null ? user.Name : null;
Property-yə müraciət etməzdən əvvəl null üçün klassik yoxlama

?. operatoru bunu daha rahat yazmağa imkan verir:

User user = null;
string displayName = user?.Name;
Null-şərtli operator ?.

Əgər user obyekti null olsa, ifadə xəta verməyəcək, sadəcə null qaytaracaq.

Nümunələr:

User user = null;

// ?. olmadan — xəta olacaq
// Console.WriteLine(user.Name); // NullReferenceException

Console.WriteLine(user?.Name); // Təhlükəsizdir — boş sətir və ya heç nə çap edəcək

Console.WriteLine(user?.GetProfileInfo()); // Eyni qayda

User[] users = null;
int? count = users?.Length; // null, əgər users == null

Operatorların zənciri

Bütün bir "zəncir" qurmaq olar:


string domain = company?.Director?.Email?.Split('@')?[1];
Daxili property-lərə təhlükəsiz giriş üçün ?. zənciri

Əgər yolun istənilən hissəsi null olsa, ifadə null qaytaracaq, istisna atmayacaq.

?? ilə birlikdə istifadə

?.?? operatorları bir yerdə əla işləyir:


string display = user?.Name ?? "Naməlum";
Təhlükəsiz çıxış və susmaya görə dəyər əvəzləməsi

Əgər user və ya user.Name null olsa, "Naməlum" çıxacaq.

3. ! nədir və nə üçün lazımdır

null xəbərdarlığını susdurma operatoru

Müasir C# versiyalarında (NRT aktivdirsə) kompilyator diqqətlə xəbərdarlıq edir ki, null ola biləcək dəyişənə müraciət edirsən. Amma bəzən sən əminsən ki, hər şey qaydasındadır. Onda susdurma operatoru ! istifadə olunur.


string? possibleNull = GetUserNameMaybeNull();
Console.WriteLine(possibleNull.Length); // Warning: null ola bilər

Console.WriteLine(possibleNull!.Length); // Kompilyator susur, amma əgər orda null varsa — istisna atacaq

Vacibdir: ! səni xətadan qorumur — sadəcə kompilyatora "mənə inan" deyir. Əgər dəyişən həqiqətən null olsa, NullReferenceException olacaq.

Harada istifadə etməmək lazımdır

! operatorunu kor-koranə istifadə etmə. Yaxşı stil — onu minimum istifadə etməkdir. Kodu elə qur ki, null ya mümkün olmasın, ya da açıq şəkildə işlənmiş olsun.

4. default — tipin "standart" dəyərini necə almaq olar

Bəzən dəyişəni sadəcə "başlanğıc vəziyyətinə" qaytarmaq lazımdır, xüsusilə də əl ilə 0, false və ya null yazmaq istəmirsənsə.

Bunun üçün default açar sözü var.

int a = default;            // a == 0
bool flag = default;        // flag == false
string s = default;         // s == null
double? d = default;        // d == null
Dəyişənləri sıfırlamaq üçün default istifadəsi

Mini-applikasiyanda, məsələn, adı və ya yaşı sıfırlaya bilərsən:

userName = default; // null
userAge = default;  // null (əgər userAge — int?)

5. Fərqlər və nüanslar: ?, !, default

Hətta təcrübəli proqramçılar bəzən ?, !default yanaşı görəndə çaşırlar. Gəlin aydınlaşdıraq, kim kimdir.

? — sən null-a icazə verirsən

  • Qiymətli tiplər üçün: int? x — artıq x null ola bilər.
  • Referans tiplər üçün: string? s — dəyişənin null ola biləcəyini açıq göstərirsən (NRT rejimində).

! — sən deyirsən ki, null olmayacaq

  • user!.Name — kompilyatora söz verirsən ki, user heç vaxt null olmayacaq.
  • Yalnız Nullable Reference Types rejimində işləyir.

default — sən "susmaya görə" dəyər istəyirsən

  • int x = default; — x 0 olacaq
  • string s = default; — s null olacaq

Müqayisə:

Sintaksis Bu nədir? Harada işləyir? Burda null nə rol oynayır?
int?
Nullable qiymətli tip Hər yerdə null təyin etmək olar
string?
Nullable referans tip (NRT) NRT rejimində null təyin etmək olar
!
Null-forgiving operator NRT rejimində Xəbərdarlığı susdurur
default
Susmaya görə dəyər Hər yerdə Referans tiplər üçün — bu null-dır

6. ?, !default istifadə edəndə tipik səhvlər

Səhv №1: düşünürlər ki, ! null-u "müalicə edir".
Əslində ! sadəcə kompilyatorun susmasına səbəb olur. Əgər dəyər həqiqətən null olsa, proqram NullReferenceException ilə çökəcək.

Səhv №2: .Value istifadə etməzdən əvvəl .HasValue yoxlamanı unudurlar.
Xüsusilə int?, bool? və digər nullable tiplərdə. Bu yoxlama olmadan InvalidOperationException istisnası ala bilərsən.

Səhv №3: "xüsusi" sıfır mənası lazım olan yerdə default istifadə edirlər.
Məsələn, 0 və ya false bəzən tamamilə normal dəyərlərdir, "boşluq" siqnalı deyil. Bu isə məntiqi səhvlərə gətirib çıxara bilər.

Səhv №4: NRT rejimində referans tiplər üçün ? istifadə etmirlər — ya da həddindən artıq istifadə edirlər.
Kimisi ? unudur və kompilyator bir dəstə xəbərdarlıq verir. Kimisi isə hər yerdə ? qoyur, hətta null heç vaxt olmayanda belə. Hər ikisi kodun oxunaqlığını və etibarlılığını azaldır.

Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION