12. diel - Podmienky v C# - Ternárny výraz a prepadávací switch
V predchádzajúcom cvičení, Riešené úlohy k 11. lekcii C# .NET, sme si precvičili získané skúsenosti z predchádzajúcich lekcií.
V dnešnej lekcii si predstavíme dve ďalšie konštrukcie, ktoré súvisia s podmienkami. Ide o oddychový tutoriál, ktorým túto tému dokončíme.
Ternárny výraz
Často sa nám stáva, že niekde potrebujeme nastaviť dve rôzne hodnoty podľa toho, či platí nejaká podmienka.
Príklad – Výpis pohlavia
Predstavme si, že máme napr. pohlavie užívateľa uložené ako
bool
(muž by bol true
) a chceme ho previesť do
textu. S doterajšími znalosťami by sme napísali asi takýto kód:
{CSHARP_CONSOLE}
bool man = true; // some variable indicating the gender
string genderName;
if (man)
genderName = "man";
else
genderName = "woman";
Console.WriteLine(genderName);
{/CSHARP_CONSOLE}
Výstup programu je samozrejme nasledujúci:
Konzolová aplikácia
man
Hoci kód iba prepína medzi dvoma hodnotami, je pomerne rozsiahly. Preto programovacie jazyky často podporujú tzv. ternárny výraz.
Syntax ternárneho výrazu
Pomocou operátorov ?
a :
môžeme získať hodnotu
podľa platnosti logického výrazu. Zapíšeme ho takto:
(expression) ? value1 : value2
Podmienku vložíme väčšinou do zátvorky ()
, potom nasleduje
otáznik ?
a dve hodnoty, ktoré sa majú vrátiť. Hodnoty sú
oddelené dvojbodkou :
. Prvá hodnota sa vráti, ak podmienka
platí, druhá hodnota sa vráti naopak v prípade neplatnosti podmienky. Ako
ľahké! Názov výrazu je
odvodený od toho, že sa skladá z troch častí (z podmienky, prvej hodnoty a
druhej hodnoty), preto ternárne.
Príklad – Použitie ternárneho výrazu
Poďme si ternárny výraz vyskúšať na príklade s pohlavím:
{CSHARP_CONSOLE}
bool man = true; // some variable indicating the gender
string genderName = (man) ? "man" : "woman";
Console.WriteLine(genderName);
{/CSHARP_CONSOLE}
Miesto typu bool
by sme mohli do zátvorky
samozrejme napísať akúkoľvek inú podmienku, napr.
(age >= 18) ? "adult" : "underage"
. V prípade
jednoduchých výrazov môžeme zátvorku aj vynechať.
Vnáranie ternárnych výrazov
Ternárne výrazy teoreticky možno vnárať do seba a tým reagovať aj na tri a viac hodnôt. Avšak vo väčšine prípadov vnorovanie skôr kód zneprehľadní. Vznikajú totiž dlhé alebo podivne zalomené riadky a nie je na prvý pohľad vidieť, ktorá časť sa kedy spustí. Ukážme si, ako by sa pomocou vnorovania ternárnych výrazov vyriešil výpis troch smajlíkov:
{CSHARP_CONSOLE}
string smiley = ":)"; // variable determining smiley
string mood = (smiley == ":)") ? "happy" : (smiley == ":(") ? "sad" : "unknown";
Console.WriteLine(mood);
{/CSHARP_CONSOLE}
Pre príklad vyššie by bolo lepšie vytvoriť vlastnú metódu, čo si ale ukážeme až v nadväzujúcom kurze objektovo orientovaného programovania.
Konštrukcie switch
s
prepadávaním
S konštrukciou switch
sme sa už stretli v lekcii Podmienky
(vetvenia). Dnes si ukážeme jej ďalšie použitie. Na rozdiel od
ternárneho výrazu ide ale skôr o historickú funkčnosť, pre ktorú dnes nie
je veľa rozumného využitia. Konštrukcia switch
je však stále
súčasťou štandardnej gramatiky C#. NET a môžeme na ňu naraziť v cudzích
zdrojových kódoch.
Príklad – Štvrťrok
Predpokladajme, že chceme podľa mesiaca v roku zistiť, ktorý je
štvrťrok. Pomocou if
a else
by príklad vyzeral
nasledovne:
{CSHARP_CONSOLE}
int month = 2;
if (month >= 1 && month <= 3)
Console.WriteLine("It's the first quarter.");
else if (month >= 4 && month <= 6)
Console.WriteLine("It's the second quarter.");
else if (month >= 7 && month <= 9)
Console.WriteLine("It's the third quarter.");
else if (month >= 10 && month <= 12)
Console.WriteLine("It's the fourth quarter.");
{/CSHARP_CONSOLE}
Ako ale použiť switch
pre takýto príklad? Možno by vás
napadol nasledujúci zápis:
{CSHARP_CONSOLE}
int month = 11;
switch (month)
{
case 1:
Console.WriteLine("It's the first quarter.");
break;
case 2:
Console.WriteLine("It's the first quarter.");
break;
case 3:
Console.WriteLine("It's the first quarter.");
break;
case 4:
Console.WriteLine("It's the second quarter.");
break;
case 5:
Console.WriteLine("It's the second quarter.");
break;
case 6:
Console.WriteLine("It's the second quarter.");
break;
case 7:
Console.WriteLine("It's the third quarter.");
break;
case 8:
Console.WriteLine("It's the third quarter.");
break;
case 9:
Console.WriteLine("It's the third quarter.");
break;
case 10:
Console.WriteLine("It's the fourth quarter.");
break;
case 11:
Console.WriteLine("It's the fourth quarter.");
break;
case 12:
Console.WriteLine("It's the fourth quarter.");
break;
}
{/CSHARP_CONSOLE}
Príklad funguje spoľahlivo, problém však je, že sme si týmto zápisom veľmi nepomohli. Podobnému repetitívnemu kódu by sme sa vždy mali vyhýbať.
Prepadávanie
Skúsme to ešte raz a využime tzv. prepadávanie. Ak
potrebujeme vo viacerých blokoch case
vykonávať rovnaký kód,
stačí tieto bloky vložiť pod seba a pomocou break
ukončiť
celú skupinu blokov naraz, nie každý blok zvlášť. Neukončené bloky tak
prepadnú a vykoná sa kód spoločný pre viac blokov:
{CSHARP_CONSOLE}
int month = 11;
switch (month)
{
case 1:
case 2:
case 3:
Console.WriteLine("It's the first quarter.");
break;
case 4:
case 5:
case 6:
Console.WriteLine("It's the second quarter.");
break;
case 7:
case 8:
case 9:
Console.WriteLine("It's the third quarter.");
break;
case 10:
case 11:
case 12:
Console.WriteLine("It's the fourth quarter.");
break;
}
{/CSHARP_CONSOLE}
Ukážka výstupu aplikácie:
Konzolová aplikácia
It's the fourth quarter.
Tento zápis je už oveľa prehľadnejší. Konštrukcia switch
má však pridanú hodnotu hlavne v prípade, keď nemôžeme použiť
väčší/menší a ide o zoznam hodnôt. V našom prípade ide skôr o
redundantný kód plný prázdnych case
.
C# podporuje prepadávanie iba v prípade prázdnych
case
. Môžete si skúsiť, že akonáhle case
obsahujú nejaký kód, ten sa bez break
nepreloží. Aj z
neprázdnych case
je možné teoreticky prepadávať do ďalších
pomocou príkazu goto case value;
, jedná sa ale o zlú a
mätúcu praktiku, preto ju nepoužívajte!
Prepadávanie používajte v konštrukcii switch
iba vtedy, ak
máte k nemu dobrý dôvod. Je však dôležité, aby ste ho vedeli čítať,
keď naň niekde narazíte.
V ďalšej lekcii, Cykly v C# .NET druhýkrát - do-while, break a continue, na nás čaká ďalšia syntax týkajúca sa cyklov, na ktorú môžeme naraziť v cudzích zdrojových kódoch.