C blokk · Vezérlési szerkezetek · 2. tananyag
A C1-es else if lánc mindent tud — de amikor egy változót sok konkrét értékkel hasonlítgatsz (menüpont, billentyű, parancsszó), a lánc zajos lesz. Erre való a switch utasítás és kifejezés. A fejezet végén megírjuk az első igazi konzolos menüt.
switch,
és mikor marad az if/else if.switch utasítást írsz:
case,
break,
default, több címke egy ágon.=>,
_), és tudod, miben más, mint az utasítás.ReadKey + switch).Ökölszabály:
| Helyzet | Eszköz |
|---|---|
| egy változó konkrét, felsorolható értékei (menüpont, billentyű, parancsszó) | switch |
tartományok, összetett feltételek (&&, ||), több változó | if / else if |
| igen–nem kérdés (bool) | if |
Ugyanaz a logika kétféleképpen:
if (menupont == 1) { Console.WriteLine("Új játék"); } else if (menupont == 2) { Console.WriteLine("Betöltés"); } else { Console.WriteLine("Nincs ilyen"); }
switch (menupont) { case 1: Console.WriteLine("Új játék"); break; case 2: Console.WriteLine("Betöltés"); break; default: Console.WriteLine("Nincs ilyen"); break; }
A switch ránézésre közli: egyetlen érték esetei következnek — a szem azonnal az eseteket látja, nem feltételeket olvas.
Melyik eszközt választanád az adott helyzetre? Az ökölszabály segít.
Console.Write("Hányadik menüpont? "); int menupont = int.Parse(Console.ReadLine()); switch (menupont) { case 1: Console.WriteLine("Új játék indul!"); break; case 2: Console.WriteLine("Játék betöltése…"); break; case 3: Console.WriteLine("Kilépés."); break; default: Konzol.Hiba("Nincs ilyen menüpont."); break; }
switch zárójelébe a vizsgált
kifejezés kerül (int, char, string — később enum is).case egy konkrét
érték; egyezéskor az ága fut le.break kötelező minden
nem üres ág végén — nélküle CS0163-at kapsz. A C# szándékosan nem
engedi a C/C++-féle néma „átcsorgást” a következő ágba: az ott
hírhedt hibaforrás volt.default a „minden más”
ág (mint az else) — hozzá is jár
break. Nem kötelező, de menüknél mindig
legyen: a felhasználó bármit beüthet.Több címke egy ágon — ha több érték ugyanazt jelenti:
switch (honap) { case 12: case 1: case 2: Console.WriteLine("tél"); break; case 3: case 4: case 5: Console.WriteLine("tavasz"); break; // … nyár, ősz … }
Az üres case-címkék halmozása szabályos: „a 12, az 1
és a 2 is erre az ágra tartozik”. Csak a kóddal rendelkező ág végéről
nem hiányozhat a break.
A switch utasítás programblokkot futtat az ágakban. Gyakran
viszont csak értéket akarunk előállítani — erre való a
switch-kifejezés, a => nyíllal:
string evszak = honap switch { 12 or 1 or 2 => "tél", 3 or 4 or 5 => "tavasz", 6 or 7 or 8 => "nyár", 9 or 10 or 11 => "ősz", _ => "nincs ilyen hónap" }; Console.WriteLine($"A(z) {honap}. hónap: {evszak}.");
honap switch { … } egy
kifejezés: értéke van — változóba tehető,
interpolációba írható.break nincs._ (aláhúzás, „discard”)
a default párja: minden más.or
kapcsolja össze — olvasd ki hangosan: „12 vagy 1 vagy 2 esetén tél”.Mikor melyik? Ha az ágakban több utasítás kell (kiírás + számolás + szín…), maradj az utasításnál; ha csak egy értéket választasz, a kifejezés rövidebb és szebb.
A modern C# hasonlítást is enged az ágakban:
pontszam switch { >= 85 => "Jeles", >= 70 => "Jó",
>= 55 => "Közepes", _ => "Nem sikerült" } — a sorrend itt is
felülről lefelé számít, mint a
C1-es else if
láncban. Használhatod, de az alapeset a konkrét értékek vizsgálata.
| Tünet | Mi történt? | Mit tegyél? |
|---|---|---|
CS0163: Control cannot fall through from one case label to another | lemaradt a break az ág végéről | minden kódos ág végére break; |
CS0152: két case ugyanarra az értékre | duplikált címke | töröld vagy vond össze a címkéket |
| rossz bevitelre semmi sem történik | nincs default ág | menüben mindig írd ki a default ágat |
case eletkor >= 18: nem fordul le | a klasszikus case csak konkrét értéket fogad | tartományhoz if/else if — vagy switch-kifejezés hasonlítással |
| a KeyChar-os switch egyik ága sem talál | 1-et írtál '1' helyett — a KeyChar char | aposztrófos címke: case '1': |
| hibasor a switch-kifejezés lezárásánál | a kifejezés egy értékadás része — pontosvessző jár a végére | }; a lezárás |
CS8509 figyelmeztetés a switch-kifejezésre | nincs minden esetet lefedő ág | tegyél a végére _ => ágat |
KonzolMenu, .NET 10 — és másold be a
Konzol.cs-t
(B8).Konzol.Cim +
box-drawing), legalább négy menüponttal: köszöntés, egy
B9-es számolós
feladatod beépítve, névjegy, kilépés.ReadKey-jel olvasd be, és
switch utasítással ágazz el; ismeretlen billentyűre
Konzol.Hiba.Konzolos fomenu switch-csel.Minden menüpont működik, a kilépés kis- és nagybetűvel is; a rossz billentyű piros hibát ad, és a program nem áll le.
⭐ alap · ⭐⭐ haladó · ⭐⭐⭐ kihívás
Évszakok: kérd be a hónap sorszámát, és írasd ki az évszakot — több
címkével (vagy or-ral), a rossz sorszámra
hibaüzenettel.
Szöveges bizonyítvány: kérd be az osztályzatot (1–5), és írasd ki a szöveges megfelelőjét (elégtelen … jeles) switch-kifejezéssel.
Nyitvatartás: kérd be a nap nevét (kisbetűvel), és írasd ki a bolt nyitvatartását — hétköznap 8–18, szombaton 8–13, vasárnap zárva. String-case-ek és több címke.
Fordító-automata: kérj be egy parancsszót (fel, le, balra, jobbra), és írasd ki, mit lép a játékos figurája — ismeretlen parancsra „Ezt nem értem.” (Igen, ez a kalandjáték előszobája.)
Zsebszámológép: kérj be két számot és egy műveleti jelet
(+, -,
*, /), és
switch-csel számold ki az eredményt. A nullával osztást
if-fel fogd meg
ELŐBB, és pirossal jelezd.
Minden kérdésnél egy válasz helyes. A végén pontszámot kapsz.
| Fogalom | Jelentés |
|---|---|
switch utasítás | egy érték konkrét eseteire ágazik el (case, break, default) |
case | egy ág címkéje: konkrét érték, amellyel a vizsgált kifejezést veti össze |
break | az ág lezárása — C#-ban kötelező, nincs néma átcsorgás |
default | a „minden más” ág — az else if lánc else-ének párja |
| több címke | halmozott case-ek ugyanarra az ágra (case 'k': case 'K':) |
| switch-kifejezés | értéket adó switch: valtozo switch { ertek => eredmeny, _ => egyeb } |
_ (discard) | a switch-kifejezés „minden más” ága |
or minta | több érték egy ágban a switch-kifejezésben (12 or 1 or 2) |
break — a C# nem enged
átcsorgást; az üres címkék halmozása viszont szabályos.default a biztonsági
háló — menüben soha ne hagyd el.=> ágak, or
a több értékre, _ a „minden másra”.