Instrukcje wyboru — if
, if-else
i switch
if-else
Instrukcje if
i switch
wybierają instrukcje do wykonania z wielu możliwych ścieżek na podstawie wartości wyrażenia. Instrukcja if
wykonuje instrukcję tylko wtedy, gdy podane wyrażenie logiczne zwróci wartość true
. Instrukcja if-else
umożliwia wybranie dwóch ścieżek kodu do naśladowania na podstawie wyrażenia logicznego. Instrukcja switch
wybiera listę instrukcji do wykonania na podstawie dopasowania wzorca z wyrażeniem.
Instrukcja if
Instrukcja if
może być dowolną z następujących dwóch form:
Instrukcja
if
zeelse
częścią wybiera jedną z dwóch instrukcji do wykonania na podstawie wartości wyrażenia logicznego, jak pokazano w poniższym przykładzie: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!"); } }
Instrukcja
if
bezelse
części wykonuje treść tylko wtedy, gdy wyrażenie logiczne daje wartośćtrue
, jak pokazano w poniższym przykładzie: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}"); }
Instrukcje można zagnieżdżać if
, aby sprawdzić wiele warunków, jak pokazano w poniższym przykładzie:
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}");
}
}
W kontekście wyrażenia można użyć operatora ?:
warunkowego, aby ocenić jedno z dwóch wyrażeń na podstawie wartości wyrażenia logicznego.
Instrukcja switch
Instrukcja switch
wybiera listę instrukcji do wykonania na podstawie dopasowania wzorca z wyrażeniem dopasowania, jak pokazano w poniższym przykładzie:
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;
}
}
W poprzednim przykładzie instrukcja switch
używa następujących wzorców:
- Wzorzec relacyjny: aby porównać wynik wyrażenia z stałą.
- Wzorzec stałej: przetestuj, czy wynik wyrażenia jest równy stałej.
Ważne
Aby uzyskać informacje o wzorcach obsługiwanych przez instrukcję switch
, zobacz Patterns (Wzorce).
W poprzednim przykładzie pokazano również przypadek default
. Przypadek default
określa instrukcje do wykonania, gdy wyrażenie dopasowania nie pasuje do żadnego innego wzorca wielkości liter. Jeśli wyrażenie dopasowania nie pasuje do żadnego wzorca przypadku i nie default
ma wielkości liter, kontrolka przechodzi przez instrukcję switch
.
Instrukcja switch
wykonuje listę instrukcji w pierwszej sekcji przełącznika, której wzorzec wielkości liter pasuje do true
wyrażenia dopasowania i którego funkcja case guard, jeśli jest obecna, daje wartość . Instrukcja switch
ocenia wzorce wielkości liter w kolejności tekstowej od góry do dołu. Kompilator generuje błąd, gdy switch
instrukcja zawiera niemożliwy do osiągnięcia przypadek. Jest to przypadek, który jest już obsługiwany przez wielkie litery lub którego wzorzec jest niemożliwy do dopasowania.
Uwaga
Przypadek default
może pojawić się w dowolnym miejscu w instrukcji switch
. Niezależnie od jego położenia wielkość liter jest oceniana tylko wtedy, default
gdy wszystkie inne wzorce wielkości liter nie są dopasowane lub goto default;
instrukcja jest wykonywana w jednej z sekcji przełącznika.
Można określić wiele wzorców wielkości liter dla jednej sekcji instrukcji switch
, jak pokazano w poniższym przykładzie:
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;
}
}
W ramach switch
instrukcji kontrolka nie może przechodzić z jednej sekcji przełącznika do następnej. Jak pokazano w przykładach w tej sekcji, zazwyczaj używasz break
instrukcji na końcu każdej sekcji przełącznika, aby przekazać kontrolę z instrukcji switch
. Możesz również użyć instrukcji return i throw , aby przekazać kontrolę z instrukcji switch
. Aby naśladować zachowanie fall-through i przekazać kontrolkę do innej sekcji przełącznika, można użyć instrukcji goto
.
W kontekście wyrażenia można użyć switch
wyrażenia do obliczenia pojedynczego wyrażenia z listy wyrażeń kandydatów na podstawie dopasowania wzorca z wyrażeniem.
Osłony wielkości liter
Wzorzec przypadku może nie być wystarczająco wyraźny, aby określić warunek wykonania sekcji przełącznika. W takim przypadku można użyć ochrony wielkości liter. Jest to dodatkowy warunek, który musi być spełniony wraz z dopasowanym wzorcem. Ochrona wielkości liter musi być wyrażeniem logicznym. Należy określić ochronę wielkości liter po słowie when
kluczowym, które jest zgodne ze wzorcem, jak pokazano w poniższym przykładzie:
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;
}
}
W poprzednim przykładzie użyto wzorców pozycyjnych z zagnieżdżonym wzorcem relacyjnymi.
specyfikacja języka C#
Aby uzyskać więcej informacji, zobacz następujące sekcje specyfikacji języka C#:
Aby uzyskać więcej informacji na temat wzorców, zobacz sekcję Wzorce i dopasowywanie wzorców specyfikacji języka C#.