1. Giriş
Təsəvvür elə ki, sən məşhur bir kofe dükanında baristasan. Yanına bir müştəri gəlir və sevimli içkilərindən birini deyir. Sən filosofluq eləmirsən, tez menyuya baxıb reaksiya verirsən: «Kapuçino? Əlbəttə! Buyur, kapuçinon!». Əgər hər bir mövqeyi ayrıca if ilə yoxlasaydın, kodun nahar vaxtı yığılan fincanlar kimi qarışıq və əlverişsiz olardı.
switch operatoru dəyişənin dəyərini rahat şəkildə yoxlamağa və nəticəyə görə müxtəlif əməliyyatlar yerinə yetirməyə imkan verir. O, yalnız müəyyən data tipləri ilə işləyir (bu barədə bir azdan danışacağıq), amma əksər istifadəçi menyularında, sadə komandalar və ya status tanıma işlərində bu əla alətdir.
2. C#-da klassik switch sintaksisi
Minimal blok-sxem belədir:
switch (Ifadə) {
case Dəyər1:
// əməliyyatlar
break;
case Dəyər2:
// əməliyyatlar
break;
...
default:
// default əməliyyatlar
break;
}
Nümunə 1: klassik menyu
Console.WriteLine("İçki seçin: 1 - Kofe, 2 - Çay, 3 - Kakao");
string input = Console.ReadLine();
int choice = int.Parse(input);
switch (choice)
{
case 1:
Console.WriteLine("Siz kofe seçdiniz. Əla seçim!");
break;
case 2:
Console.WriteLine("Çay da pis deyil.");
break;
case 3:
Console.WriteLine("Kakao — rahatlıq sevənlər üçün!");
break;
default:
Console.WriteLine("Menyuda belə içki yoxdur.");
break;
}
- switch bloku choice dəyişənini case dəyərləri ilə müqayisə edir.
- Hər variantdan sonra mütləq break; yazılır — yoxsa icra növbəti case-ə keçəcək (bu barədə bir azdan).
- default bloku — else kimidir; heç bir case uyğun gəlməsə işləyir.
switch içəridə necə işləyir? — Addım-addım
- Əvvəlcə switch sonrası mötərizədəki ifadə hesablanır (bizim nümunədə — choice dəyişəni).
- Proqram onu ardıcıl olaraq hər case dəyəri ilə müqayisə edir.
- Əgər uyğun gəldi — həmin blokun əmrləri icra olunur. Sonra break gəlir və proqram switch blokundan çıxır.
- Heç bir case uyğun gəlməsə, default bloku işləyir (əgər varsa).
Vizual sxem
| Dəyişənin dəyəri | case 1 | case 2 | case 3 | default |
|---|---|---|---|---|
| 1 | + | |||
| 2 | + | |||
| 3 | + | |||
| başqa | + |
«+» — bu blok icra olunur
3. Klassik switch hansı tipləri dəstəkləyir?
Klassik sintaksisdə (yəni, "Pattern Matching" və yeni fəndlər olmadan, onlar barədə sonra danışacağıq!) switch aşağıdakıları dəstəkləyir:
- Sadə tam ədədi tiplər (int, byte, char, long, short, sbyte, ushort, uint, ulong)
- Sətirlər (string)
- Enum-lar (enum)
- Simvollar (char)
Nümunə 2: sətirlə switch
Console.WriteLine("Komanda seçin: start, stop, pause");
string command = Console.ReadLine();
switch (command)
{
case "start":
Console.WriteLine("Proqram başladıldı!");
break;
case "stop":
Console.WriteLine("Proqram dayandırıldı.");
break;
case "pause":
Console.WriteLine("Proqram pauzada.");
break;
default:
Console.WriteLine("Naməlum komanda.");
break;
}
4. break nə üçün lazımdır və onu unutsaq nə baş verər?
Yeni başlayan proqramçılar arasında ən məşhur səhv — break; yazmağı unutmaqdır case içində. Gəlin baxaq, onu buraxsaq nə olar.
Nümunə 3: növbəti bloka düşmək (fall-through)
int day = 2;
switch (day)
{
case 1:
Console.WriteLine("Bazar ertəsi");
break;
case 2:
Console.WriteLine("Çərşənbə axşamı");
case 3:
Console.WriteLine("Çərşənbə");
break;
default:
Console.WriteLine("Naməlum gün");
break;
}
Nə baş verəcək?
- Girişdə day = 2.
- Əvvəlcə bu sətr işləyəcək: "Çərşənbə axşamı"
- break yoxdur — icra dərhal case 3-ə keçəcək və "Çərşənbə" yazacaq
- Sonra break; gəlir — çıxış.
Ekranda görəcəyik:
Çərşənbə axşamı
Çərşənbə
Bu tipik səhvdir!
- Əgər YALNIZ bir əməliyyat etmək istəyirsənsə, hər case-də break; yaz.
- Əgər (nadir hallarda) bəzi variantlar eyni məntiqi icra etməlidirsə, onları «birləşdirə» bilərsən (aşağıya bax).
5. case dəyərlərinin qruplaşdırılması
Bəzən bir neçə dəyər eyni cür işləməlidir. Eyni kodu təkrar yazmağa nə ehtiyac?
Nümunə 4: bir neçə case üçün eyni reaksiya
char grade = 'B';
switch (grade)
{
case 'A':
case 'B':
case 'C':
Console.WriteLine("Keçdin!");
break;
case 'D':
case 'E':
Console.WriteLine("Daha yaxşı ola bilər.");
break;
default:
Console.WriteLine("Yanlış qiymət.");
break;
}
Nə baş verir?
- Əgər grade 'A', 'B' və ya 'C' olarsa, birinci blok işləyəcək: "Keçdin!".
- 'D' və ya 'E' olarsa — ikinci blok.
- Başqa dəyər — default.
6. Klassik switch-də nə olar, nə olmaz
Olar:
- case-də literal (sabit) istifadə etmək, məsələn: case 1:, case 'A':, case "stop":.
- enum (enum-lar) müqayisə etmək.
- default yazmaya bilərsən, amma adətən faydalıdır.
Olmaz:
- case-də dəyişən istifadə etmək (yalnız sabitlər olar).
- Aralıq müqayisəsi etmək (case >= 5:, case x > 10: — belə olmaz!).
- double, float və digər real ədədlər istifadə etmək olmaz — yalnız tam, string, char, enum.
- Bir case-də bir neçə dəyəri vergüllə yazmaq olmaz (case 1, 2: olmaz; bir neçə case ardıcıl yaz).
7. Xüsusiyyətlər və tipik səhvlər
Real layihələrdə switch tez-tez menyular, status emalı, komandalar, səhv kodları və daha min iş üçün istifadə olunur. Amma hər alət kimi, burada da incəliklər var.
Tipik səhvlər:
- break unudulub (artıq danışdıq).
- Yanlış switch ifadə tipi (məsələn, double istifadə cəhdi).
- Sətir registeri uyğun gəlmir (case "Start": "start" ilə uyğun gəlməyəcək) — sətirlər registerə həssasdır!
- Emal olunmamış dəyər (default unudulub, istifadəçi səhv daxil edib).
Daxili switch-lərlə tələ
Belə kod rast gəlinə bilər, amma adətən oxunması çətin olur. Əgər özünü switch içində switch yazarkən tutursansa, bəlkə kodunu ayrıca metoda çıxarmaq və ya OOP/enum/array istifadə etmək vaxtıdır.
GO TO FULL VERSION