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ə (??) və 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";
?? operatoru bunu daha qısa yazmağa imkan verir:
string userName = null;
string displayName = userName ?? "Qonaq";
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ə";
Əgər str1 null deyilsə, o istifadə olunur. Yox əgər str2 də null 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;
?. operatoru bunu daha rahat yazmağa imkan verir:
User user = null;
string displayName = user?.Name;
Ə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];
Əgər yolun istənilən hissəsi null olsa, ifadə null qaytaracaq, istisna atmayacaq.
?? ilə birlikdə istifadə
?. və ?? operatorları bir yerdə əla işləyir:
string display = user?.Name ?? "Naməlum";
Ə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
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 ?, ! və 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? |
|---|---|---|---|
|
Nullable qiymətli tip | Hər yerdə | null təyin etmək olar |
|
Nullable referans tip (NRT) | NRT rejimində | null təyin etmək olar |
|
Null-forgiving operator | NRT rejimində | Xəbərdarlığı susdurur |
|
Susmaya görə dəyər | Hər yerdə | Referans tiplər üçün — bu null-dır |
6. ?, ! və 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.
GO TO FULL VERSION