Příkazy výběru (referenční příručka jazyka C#)
Následující příkazy vyberou příkazy, které se mají provést z několika možných příkazů na základě hodnoty výrazu:
- Příkaz
if: vybere příkaz, který se má spustit, na základě hodnoty logického výrazu. - Příkaz
switch: Vybere seznam výrazů, který se spustí na základě shody vzoru s výrazem.
Příkaz if
Příkaz if může mít libovolnou z následujících dvou forem:
Příkaz s částí vybere jeden ze dvou příkazů ke spuštění na základě hodnoty logického výrazu, jak ukazuje
ifelsenásledující příklad:DisplayWeatherReport(15.0); // Output: Cold. DisplayWeatherReport(24.0); // Output: Perfect! void DisplayWeatherReport(double tempInCelsius) { if (tempInCelsius < 20.0) { Console.WriteLine("Cold."); } else { Console.WriteLine("Perfect!"); } }Příkaz bez části provede tělo pouze v případě, že se logický
ifelsevýraz vyhodnotítruejako , jak ukazuje následující příklad:DisplayMeasurement(45); // Output: The measurement value is 45 DisplayMeasurement(-3); // Output: Warning: not acceptable value! The measurement value is -3 void DisplayMeasurement(double value) { if (value < 0 || value > 100) { Console.Write("Warning: not acceptable value! "); } Console.WriteLine($"The measurement value is {value}"); }
Příkazy můžete if vnořit a zkontrolovat více podmínek, jak ukazuje následující příklad:
DisplayCharacter('f'); // Output: A lowercase letter: f
DisplayCharacter('R'); // Output: An uppercase letter: R
DisplayCharacter('8'); // Output: A digit: 8
DisplayCharacter(','); // Output: Not alphanumeric character: ,
void DisplayCharacter(char ch)
{
if (char.IsUpper(ch))
{
Console.WriteLine($"An uppercase letter: {ch}");
}
else if (char.IsLower(ch))
{
Console.WriteLine($"A lowercase letter: {ch}");
}
else if (char.IsDigit(ch))
{
Console.WriteLine($"A digit: {ch}");
}
else
{
Console.WriteLine($"Not alphanumeric character: {ch}");
}
}
V kontextu výrazu můžete ?: pomocí podmíněného operátoru vyhodnotit jeden ze dvou výrazů na základě hodnoty logického výrazu.
Příkaz switch
Příkaz vybere seznam výrazů, který se spustí na základě shody vzoru s výrazem shody, jak switch ukazuje následující příklad:
DisplayMeasurement(-4); // Output: Measured value is -4; too low.
DisplayMeasurement(5); // Output: Measured value is 5.
DisplayMeasurement(30); // Output: Measured value is 30; too high.
DisplayMeasurement(double.NaN); // Output: Failed measurement.
void DisplayMeasurement(double measurement)
{
switch (measurement)
{
case < 0.0:
Console.WriteLine($"Measured value is {measurement}; too low.");
break;
case > 15.0:
Console.WriteLine($"Measured value is {measurement}; too high.");
break;
case double.NaN:
Console.WriteLine("Failed measurement.");
break;
default:
Console.WriteLine($"Measured value is {measurement}.");
break;
}
}
V předchozím příkladu používá switch příkaz následující vzory:
- Relační vzor: k porovnání výsledku výrazu s konstantou.
- Konstantní vzor: k otestování, jestli se výsledek výrazu rovná konstantě.
Důležité
Informace o vzorech podporovaných switch příkazem najdete v tématu Vzory.
Předchozí příklad také ukazuje default případ . Case určuje příkazy, které se mají provést, když výraz shody neodpovídá default žádnému jinému vzoru případu. Pokud výraz shody neodpovídá žádnému vzoru case a neexistuje žádný případ, ovládací prvek default propadne switch příkazem .
Příkaz spustí seznam výrazů v první části switch, jejíž vzor ná případu odpovídá výrazu shody a jehož funkce case guard ( pokud je k dispozici) se switch vyhodnotí jako true . Příkaz switch vyhodnocuje vzory případů v pořadí textu shora dolů. Kompilátor vygeneruje chybu, switch pokud příkaz obsahuje nedosažitelný případ. To je případ, který je již zpracován velkými písmeny nebo jehož vzor se nedá shodovat.
Poznámka
Případ default se může objevit na libovolném místě v rámci příkazu switch . Bez ohledu na svou pozici se případ vždy vyhodnotí jako poslední a pouze v případě, že se neshodují všechny ostatní default vzory ostatních případů.
Můžete zadat více vzorů případu pro jednu část switch příkazu, jak je znázorněno v následujícím příkladu:
DisplayMeasurement(-4); // Output: Measured value is -4; out of an acceptable range.
DisplayMeasurement(50); // Output: Measured value is 50.
DisplayMeasurement(132); // Output: Measured value is 132; out of an acceptable range.
void DisplayMeasurement(int measurement)
{
switch (measurement)
{
case < 0:
case > 100:
Console.WriteLine($"Measured value is {measurement}; out of an acceptable range.");
break;
default:
Console.WriteLine($"Measured value is {measurement}.");
break;
}
}
V rámci switch příkazu nemůže ovládací prvek procházet z jedné sekce přepínače na další. Jak ukazují příklady v této části, obvykle použijete příkaz na konci každé sekce přepínače k předání break řízení z switch příkazu . K předání ovládacího prvku z příkazu můžete použít také příkazy return a throw. switch K napodobování propadu chování a předání řízení do jiné sekce přepínače můžete použít goto příkaz.
V kontextu výrazu můžete switch pomocí výrazu vyhodnotit jeden výraz ze seznamu kandidátských výrazů na základě shody vzoru s výrazem.
Case guards
Vzor případu nemusí být dostatečně vyjadřující k určení podmínky pro spuštění sekce přepínače. V takovém případě můžete použít ochranu případu. To je další podmínka, která musí být splněná společně s odpovídající vzorem. Ochrana case guard musí být logický výraz. Za klíčové slovo, které následuje vzor, zadáte ochranu case when guard, jak ukazuje následující příklad:
DisplayMeasurements(3, 4); // Output: First measurement is 3, second measurement is 4.
DisplayMeasurements(5, 5); // Output: Both measurements are valid and equal to 5.
void DisplayMeasurements(int a, int b)
{
switch ((a, b))
{
case (> 0, > 0) when a == b:
Console.WriteLine($"Both measurements are valid and equal to {a}.");
break;
case (> 0, > 0):
Console.WriteLine($"First measurement is {a}, second measurement is {b}.");
break;
default:
Console.WriteLine("One or both measurements are not valid.");
break;
}
}
Předchozí příklad používá poziční vzory s vnořenými relačními vzory.
Podpora verzí jazyka
Příkaz switch podporuje porovnávání vzorů počínaje jazykem C# 7.0.
V jazyce C# 6 a starších verzích použijete switch příkaz s následujícími omezeními:
- Výraz shody musí být jednoho z následujících typů: char, string, bool, integrální číselný typ nebo typ výčtu.
- V popiscích jsou povolené jenom konstantní
casevýrazy.
specifikace jazyka C#
Další informace najdete v následujících částech specifikace jazyka C#:
Další informace o funkcích zavedených v jazyce C# 7.0 a novějších najdete v následujících poznámkách k návrhu funkcí: