1. Expression-lar vs Statement-lar
C#-da bütün komandalar iki kateqoriyaya bölünür: komandalar (Statement) və ifadələr (Expression). Komanda üçün adətən deyirlər ki, o icra olunur, ifadə üçün isə — hesablanır. Amma əsas məsələ bu deyil.
Əsas fərq: ifadənin hesablanma nəticəsi var. Bu nəticənin tipi olur və onu dəyişənə mənimsətmək və ya başqa ifadədə istifadə etmək olar.
Nümunələr:
| Kod | Qeyd |
|---|---|
|
Komanda |
|
İfadə, tipi bool |
|
İfadə, tipi i dəyişəninin tipi ilə eynidir |
|
İfadə, tipi x dəyişəninin tipi ilə eynidir |
Bu bizə nə verir?
Çoxlu komandalar əslində ifadədir (hesablanma nəticəsi var). Məsələn, belə kod işləyir:int x, y, z;
x = y = z = 1; // x = (y = (z = 1));
İfadənin nəticəsini lazım deyilsə, sadəcə görməməzlikdən gəlmək olar:
Console.ReadLine(); // daxil olunan nəticəni görməməzlikdən gəlirik
Bu rahatdır, əgər ifadə nəticədən əlavə nəsə faydalı iş görürsə (məsələn, ekrana çıxarır və ya input oxuyur).
2. Ternary operator
C#-da xüsusi bir ternary (üçlü) operator var. O, if–else operatorunun qısa yazılışına bənzəyir:
Şərt ? İfadə1 : İfadə2;
Əgər Şərt doğrudursa, İfadə1 hesablanır, əks halda — İfadə2. Şərtdən sonra ? qoyulur, iki ifadə isə : ilə ayrılır.
if-else-dən əsas fərqi: ternary operator — ifadədir, onun nəticəsini dəyişənə mənimsətmək və ya başqa ifadədə istifadə etmək olar.
Məsələn, iki ədədin minimumunu hesablayaq:
int a = 2;
int b = 3;
int min = a < b ? a : b;
Və ya şərtdən asılı olaraq dəyişənə fərqli dəyərlər mənimsədək:
int age = 25;
int money;
if (age > 30)
money = 100;
else
money = 50;
Eyni şeyi ternary operatorla:
int age = 25;
int money = age > 30 ? 100 : 50;
Nəyi seçmək yaxşıdır: if-else yoxsa ternary operator? Sürət fərqi yoxdur, amma ternary operator qısa şərtlər üçün əladır. Əgər kod bir sətrə sığmırsa — oxunaqlılıq üçün if-else istifadə etmək daha yaxşıdır.
3. İşləmə incəlikləri
Dəyərlərin tipləri
Ternary operatorun hər iki qolu (<doğru_olanda_dəyər> və <səhv_olanda_dəyər>) eyni tipdə olmalıdır və ya uyğun olmalıdır (məsələn, hər ikisi string və ya hər ikisi int).
İşləyir:
int a = 10, b = 20;
int max = (a > b) ? a : b; // hər iki qol — int
Kompilyasiya xətası:
int a = 10, b = 20;
// string və int uyğun deyil
string result = (a > b) ? "boyukdur" : 0; // Kompilyasiya xətası
Düzgün variant:
int a = 10, b = 20;
string result = (a > b) ? "boyukdur" : "kicikdir və ya beraberdir";
Nümunə: ədədlərlə işləmək
int number = -5;
int abs = (number >= 0) ? number : -number;
Console.WriteLine(abs); // 5
4. Ternary operatoru tətbiqə yerləşdirmək
Gəlin bir dialoq proqramı yazaq: salamdan əlavə, proqram istifadəçiyə gələn il neçə yaşı olacağını deyəcək və onun yetkin olub-olmayacağını göstərəcək.
Console.Write("Adınızı daxil edin: ");
string name = Console.ReadLine();
Console.Write("Yaşınızı daxil edin: ");
string ageText = Console.ReadLine();
int age = int.Parse(ageText);
int nextYear = age + 1;
string status = (nextYear >= 18) ? "yetkin" : "yetkin deyil";
Console.WriteLine($"Salam, {name}! Gələn il {nextYear} yaşınız olacaq. Siz {status} olacaqsınız.");
Detalları izah edək:
- status dəyişəni ternary operatorla hesablanır: əgər gələn il yaş 18 və ya çoxdursa, istifadəçi yetkin olacaq (və ya elə qalacaq).
- Ternary operatoru asanlıqla birbaşa sətrlərə (məsələn, interpolasiya ilə $"") əlavə etmək olar.
5. İç-içə ternary operatorlar — ehtiyatlı ol!
Ternary operatoru bir-birinin içində istifadə etmək olar (hər qolun içində başqa bir ternary ola bilər). Amma… bu adətən baş ağrısı yaradır, xüsusən də kodu səndən sonra oxuyan üçün (hətta 2 gün sonra özün üçün də).
Nümunə: yaşa görə kateqoriya təyin etmək
string category = (age < 7) ? "məktəbəqədər" :
(age < 18) ? "məktəbli" :
(age < 65) ? "böyuk" : "pensioner";
Qərar cədvəli:
| Yaş | Şərt | Nəticə |
|---|---|---|
| < 7 | age < 7 | məktəbəqədər |
| 7–17 | age < 18 | məktəbli |
| 18–64 | age < 65 | böyuk |
| 65 və daha çox | əks halda | pensioner |
Belə kodu oxumaq hələ mümkündür, amma məntiq daha çətin olsa — if-else if-else istifadə etmək daha yaxşıdır.
6. Lifehack: ternary operator və bool tipi
Bəzən belə kod görmək olur:
bool adult = (age >= 18) ? true : false;
Amma bu artıqdır. (age >= 18) ifadəsi özü bool qaytarır. Ona görə də sadəcə belə yazmaq olar:
bool adult = (age >= 18);
GO TO FULL VERSION