IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

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:

bool man = true; // some variable indicating the gender
string genderName;
if (man)
    genderName = "man";
else
    genderName = "woman";
Console.WriteLine(genderName);

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:

bool man = true; // some variable indicating the gender
string genderName = (man) ? "man" : "woman";
Console.WriteLine(genderName);

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:

string smiley = ":)"; // variable determining smiley
string mood = (smiley == ":)") ? "happy" : (smiley == ":(") ? "sad" : "unknown";
Console.WriteLine(mood);

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:

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.");

Ako ale použiť switch pre takýto príklad? Možno by vás napadol nasledujúci zápis:

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;
}

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:

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;
}

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.


 

Predchádzajúci článok
Riešené úlohy k 11. lekcii C# .NET
Všetky články v sekcii
Základná konštrukcia jazyka C# .NET
Preskočiť článok
(neodporúčame)
Cykly v C# .NET druhýkrát - do-while, break a continue
Článok pre vás napísal Radek Vymětalík
Avatar
Užívateľské hodnotenie:
2 hlasov
...
Aktivity