Často se v programování dostaneme do situace, kdy potřebujeme, aby se část kódu (některé příkazy) vykonala pouze za určitého stavu (při splnění nějaké podmínky), a za jiného stavu, aby se tato část kódu vynechala, anebo se dokonce provedla jiná jeho část (která se zase neprovede při splnění té podmínky).
K tomu účelu máme řídicí strukturu větvení.
V C# máme dva šikovné příkazy, které realizují větvení.
Nejběžnější je příkaz if. Syntaxe je:
if (podmínka) příkaz-při-splnění else příkaz-při-nesplnění
Do podmínky dáme výraz, který se vyhodnotí jako true nebo false a program se dále vykonává tak, že pokud je podmínka splněna (výsledkem je true), provede se příkaz-při-splnění (a neprovede se příkaz-při-nesplnění), zatímco pokud podmínka splněna není (výsledkem je false), provede se příkaz-při-nesplnění (a neprovede se příkaz-při-splnění).
Ať už je podmínka splněna, nebo ne, po provedení výše popsaného se pokračuje následujícím příkazem za touto konstrukcí if-else.
Větev else může chybět, čili příkaz if může vypadat i takto:
if (podmínka) příkaz-při-splnění
Při nesplnění podmínky se v tomto případě prostě celá větev if přeskočí a pokračuje se příkazem následujícím za touto konstrukcí.
V částech příkaz-při-splnění i příkaz-při-nesplnění může být buď jediný příkaz, anebo více příkazů uzavřených do bloku. Doporučuje se ale kvůli čistotě kódu a vyvarování se chyb při jeho úpravách i jediný příkaz uzavřít do bloku (do složených závorek).
Příklad úplného příkazu if včetně else větve:
if (a == b) { Console.WriteLine($"Čísla {a} a {b} jsou stejná."); } else { Console.WriteLine($"Čísla {a} a {b} se liší."); }
Příklad neúplného příkazu if (bez else):
if (DateTime.Now.Month == 6 && DateTime.Now.Day == 2) { Console.WriteLine("Dnes mám narozeniny!"); }
Konstrukce if-else se dají řetězit, pokud potřebujeme provádění programu rozvětvit do více než dvou směrů. Např. pokud je hodnota proměnné záporná, provede se něco, pokud je nula, provede se něco jiného, pokud je kladná, provede se ještě úplně něco jiného.
if (result < 0) { // Záporná hodnota. StartHeating(); } else if (result == 0) { // Nula. StopHeating(); } else { // Zde již nezbývá nic jiného, než že hodnota je kladná. NotifySecurity(); }
Další příkaz C#, který se dá použít pro větvení, je switch. Tento příkaz se hodí v situacích, kdy se rozhodujeme podle jednoduché hodnoty (např. podle proměnné typu celé číslo), ale pro každou hodnotu té proměnné se má provést něco jiného. Čili v programu máme mnohocestné větvení, které je s příkazem switch jednodušší a přehlednější než zřetězená sada příkazů if.
Syntaxe příkazu switch vypadá takto:
switch (výraz) { case první-hodnota: příkazy-pro-první break; case druhá-hodnota: příkazy-pro-druhou break; case třetí-hodnota: příkazy-pro-třetí break; // ... default: příkazy-pro-jiné-hodnoty break; }
Příkaz switch ovlivní provádění programu takto:
Příkaz switch můžeme použít např. pro mapování sady hodnot na jinou sadu hodnot (např. mapování čísel na barvy) – viz následující code snippet.
ConsoleColor color; switch (enteredValue) { case 1: color = ConsoleColor.Red; break; case 2: color = ConsoleColor.Green; break; case 3: color = ConsoleColor.Blue; break; default: color = ConsoleColor.Black; break; }