1. Giriş
Gəlin belə bir vəziyyəti təsəvvür edək. Kodu yazanda pişiklər haqqında məlumat saxlayırsan. Və istəyirsən ki, məsələn, pişiyin yaşından əlavə, "məlumat yoxdur", "yaş məlum deyil" kimi vəziyyətləri də saxlayasan. 0 saxlamaq olardı, amma sıfır — tamamilə normal yaşdır.
int age = 0; // Pişiyin yaşı. Amma 0 nədir? Bu balaca pişikdir, yoxsa "məlum deyil"?
Problem ondadır ki, int yalnız tam ədədləri qəbul edir, amma "məlumat yoxdur" kimi bir şey tam ədədlərdə yoxdur. Əgər yaş sətir (string) olsaydı, orada null təyin etmək olardı. Amma ədədlərlə bu alınmır:
int age = null; // Səhv! int tipli dəyişənə null vermək olmaz
Bu ona görədir ki, dəyər tipləri (struct-lar kimi int, double, DateTime, bool) həmişə nəsə saxlayır. Onlarda "boş" vəziyyət yoxdur (referans tiplərdən fərqli olaraq, orada null sadəcə obyektin olmamasıdır).
Həyatdan nümunə:
Bu məhdudiyyəti keçmək üçün proqramçılar bəzən "xüsusi" dəyərlər fikirləşirlər: məsələn, "məlumat yoxdur" üçün -1 və ya int.MaxValue. Amma bu nə gözəl, nə rahat, nə də təhlükəsizdir: asanlıqla real dəyəri stub ilə səhv salmaq olar.
2. Nullable-tip: həm də "null" ala bilən tip
İdeya
Bəs necə olar, əgər adi ədədlərə (və ümumiyyətlə bütün dəyər tiplərinə) həm dəyər, həm də null saxlamağa icazə versək?
C#-da bu xüsusi wrapper class Nullable<T> ilə həll olunub. Belə class ya T tipli dəyər, ya da heç nə (yəni null) saxlaya bilər.
Sintaksis
int? age = null; // age dəyişəni həm ədəd, həm də null ola bilər
C# compiler-i belə kod görəndə, əslində bunu belə başa düşür:
Nullable<int> age = new Nullable<int>(); // age dəyişəni heç bir dəyər saxlamır
Yaxud, əgər dəyəri açıq şəkildə vermək lazımdırsa:
Nullable<int> age = new Nullable<int>(42); // age 42 ədədini saxlayır
Beləliklə, sual işarəsi istənilən dəyər tipini onun nullable-versiyasına çevirir:
- int? (eyni şeydir, Nullable<int> kimi)
- double?
- DateTime?
- və digər struct-lar
Ən populyar tip strukturlar üçün Nullable-wrapper-lar
| Adi tip | Nullable-tip | Yazılış nümunəsi |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
Wrapper class istifadə edərək daha uzun da yaza bilərsən:
Nullable<int> pages = null;
Amma int? yazmaq daha qısa və ona görə də daha cool-dur.
3. Nullable-tipdən necə istifadə etməli
Təyin etmək və yoxlamaq
null təyin etmək referans tiplərdə olduğu kimi işləyir:
Elan və təyin etmək
int? temperature = null;
temperature = 25;
null-a yoxlamaq
Bizim nullable-tipdə həqiqi dəyər olub olmadığını necə bilmək olar?
if (temperature != null)
{
Console.WriteLine($"Temperatur: {temperature}");
}
else
{
Console.WriteLine("Temperatur haqqında məlumat yoxdur");
}
Nullable-tiplərin xüsusiyyətləri: .HasValue və .Value
Nullable-tiplərdə iki vacib property var:
- .HasValue — dəyişəndə nəsə varsa (null deyil) true qaytarır.
- .Value — əgər dəyər varsa, onu qaytarır (yoxdursa exception atır).
int? temperature = null;
if (temperature.HasValue) //exception olmayacaq!
{
Console.WriteLine($"Temperatur: {temperature.Value}°C");
}
else
{
Console.WriteLine("Temperatur məlum deyil");
}
Bu kod işləyəcək: temperature null deyil, içində null saxlayır. Və sən həmişə Nullable tipində HasValue property-sini çağıra bilərsən. Amma .Value almağa çalışanda, əgər dəyər yoxdursa — pis fikirdir, InvalidOperationException exception-u alacaqsan. Əvvəlcədən dəyərin olub-olmadığını yoxla!
Qısa çıxış sintaksisi
Çox vaxt sadəcə nullable-tipli dəyişəni istifadə etmək kifayətdir — C# özü hər şeyi başa düşəcək:
int? hours = null;
Console.WriteLine(hours); // heç nə çıxarmır (sadəcə boş)
hours = 10;
Console.WriteLine(hours); // 10 çıxarır
4. Əməliyyatlar və nullable-tiplər: arifmetika, müqayisələr, çevirmələr
Əməliyyatlar: nə baş verir?
Əgər operandlardan biri nullable-dirsə, nəticə də nullable olacaq.
Əgər operandlardan biri null olsa, nəticə də null olacaq.
int? a = 5;
int? b = null;
int? sum = a + b; // sum == null
int? c = 10;
int? d = 15;
int? total = c + d; // total == 25
Müqayisə əməliyyatları
Nullable-tipləri adi ədədlərlə müqayisə etmək olar:
int? score = null;
if (score > 0) Console.WriteLine("Əla nəticə!");
else Console.WriteLine("Nəticə yoxdur"); // Bu hissə işləyəcək
Əgər score null-dursa, score > 0 şərti false olacaq.
Aydın və qeyri-aydın çevirmə
- Adi tipdən nullable-ya: avtomatik.
- Nullable-dan adi tipə: yalnız null deyilsə (yoxsa exception olacaq).
int? x = 3;
int y = x.Value; // Ok, əgər x null deyil
// Qeyri-aydın
int? z = y;
5. Nullable və metodlar: parametrlər və qaytarılan dəyərlər
Nullable-dəyərləri qaytarmaq
Əgər metod həmişə nəticə qaytara bilmirsə, nullable-tipləri qaytarılan dəyər kimi istifadə et:
// Metod login ilə istifadəçini axtarır və yaşını qaytarır, tapmasa null
int? FindUserAge(string login)
{
// ... burada axtarış məntiqi
return null; // tapılmayıbsa
}
Nullable-parametrlər
Parametr kimi nullable-dəyərlər qəbul etmək olar ki, açıq göstərəsən: “ola bilər, olmaya da bilər”.
void PrintTemperature(int? temp)
{
if (temp == null)
Console.WriteLine("Temperatur məlum deyil");
else
Console.WriteLine($"Temperatur: {temp} dərəcə");
}
GO TO FULL VERSION