Dart Nullability

Ba’zida o’zgaruvchilar uchun hech qanday qiymat bermay ketishga ehtiyoj bo’ladi yoki uning qiymati mavjudligini biz aniq ayta olmaymiz. Birinchi holat uchun ko’rib o’tadigan bo’lsak, buning uchun bir qancha dasturlash tillarida mavjud bo’lgani kabi Dart dasturlash tilida ham null qiymati mavjud. Bu o’zgaruvchining hech qanday qiymati yo’qligini bildiradi. Dart 2.12 versiyasidan boshlab, o’zgaruvchilarga hech qanday qiymat bermay ketish imkoniyati va shu holatda uning qiymati null qilib olinadigan bo’ldi. Undan oldingi versiyalarda esa o’zgaruvchiga aniq qiymat berilishi kerak edi.

void main() {
var number;
print(number);
}
>> null

Oldingi holatda bu xatolikni bartaraf etish va inobatga olib ketish uchun ? operatori qo’llanilgan va hozir ham bu operatordan qo’llaniladi ba’zi bir vaziyatlarda.

void main() {
String? name;
print(name);
}
>> null

?? operatori

Bu operator o’zgaruvchiga qiymatni belgilashda uni null likka tekshiradi. Bu nima uchun? Quyidagi misolni ko’ramiz:

void main() {
String name;
String name1 = name;
print(name1);
}
>> Error: Non-nullable variable 'name' must be assigned before it can be used.

Ushbu kod ishga tushirilgan vaqtda xatolikka duch kelamiz. Bu xatolik qiymatsiz o’zgaruvchini boshqa bir o’zgaruvchiga belgilash vaqtida yuzaga keldi. Aynan mana shu xatoliklarni bartaraf etish uchun ham ?? operatori ishlatiladi. Bu operator o’zgaruvchini null qiymatligini tekshiradi va shunday bo’lsa, uning o’rniga boshqa qiymatni olib ketadi belgilangan. Sintaksis :

qiymat1 ?? qiymat2qiymat1 qiymati null bo’lsa, qiymat2ni aks holda qiymat1 o’zini olib ketadi.

void main() {
String? name;
String name1 = name ?? "uzbekdevs";
print(name1);
}
>> uzbekdevs

Hozirda name o’zgaruvchisi qiymati null va u name1 o’zgaruvchisiga tayinlandi. Bunda name ?? “uzbekdevs” ifodasidagi name o’zgaruvchisi qiymati null bo’lgani uchun ham ?? Operatoridan keyin berilgan qiymatni oladi va name1 o’zgaruvchisi qiymati “uzbekdevs” ga teng bo’ladi.

Yana bir misol, butun turdagi o’zgaruvchi va uning qiymati null ga teng. Shunda uni tekshirib qiymatini 0 ga o’zgartirib keta olamiz.

void main() {
int? son;
son = son ?? 0;
print(son);
}
>> 0

Bu operatorni ikki son yig’indisini hisoblovchi funksiyada ishlatsak, bu funksiyaga hech qanday qiymatsiz o’zgaruvchini olgan vaqtda ulardagi qiymatlar yig’indisini hisoblashda xatolik chiqadi.

void main() {
int x =5, y;
print(yigindi(x, y));
}

int yigindi(int a, int b) {
return a + b;
}
>> Error: Non-nullable variable 'name' must be assigned before it can be used.

Shunday holatlar uchun biz kodimizda xato chiqmasligini oldini olishimiz kerak va funksiya parametrlariga ? Operatorini berib ketishimiz kerak. Bu esa null qiymatli o’zgaruvchini qabul qilish imkonini yaratadi.

void main() {
int x = 5;
int? y;
print(yigindi(x, y));
}

int yigindi(int? a, int? b) {
return (a ?? 0)+ (b ?? 0);
}
>> 5

a va b parametrlaridan qaysidir biriga yoki ikkisiga ham null qiymat yuborilsa, 0 qiymatga o’zgartirib oladi.

! – null tasdiqlash operatori. Bu operator o’zgaruvchi aniq null qiymatga ega emasligini bilganimizda begilab qo’yish uchun ishlatiladi. Nega? Chunki kompyuter bu haqida oldindan ma’lumotga ega bo’lmaydi. Biz esa buni bilamiz.

void main() {
int x = 5;
int y = 4;
print(yigindi(x, y));
}

int yigindi(int a, int b) {
return a!+ b!;
}
>> Warning: Operand of null-aware operation '!' has type 'int' which excludes null. >> 9

?. – operatori ayrim turlarda yaratilgan o’zgaruvchi (obyekt) xususiyat va funksiyalariga kirishni ta’minlaydi null qiymatga ega bo’lmasa.

void main() {
int? number;
print(number?.isNegative);
}
>> Warning: Operand of null-aware operation '!' has type 'int' which excludes null. >> null

number o’zgaruvchisining manfiy sonligi tekshirilganda isNegative xususiayati orqali ?. operatori ishlatilmasa null qiymatni tekshirmaydi va bu haqida xato ham beradi. Agarda bu operatordan foydalanilsa qiymat null bo’lsa, null ni aks holda manfiyligini tekshirib bool qiymatida natija qaytaradi.