Urvalsuttryck - if
, if-else
och switch
Instruktionen if
, if-else
och switch
väljer instruktioner som ska köras från många möjliga sökvägar baserat på värdet för ett uttryck. Instruktionen if
kör endast en -instruktion om ett angivet booleskt uttryck utvärderas till true
. Med instruktionen if-else
kan du välja vilken av de två kodsökvägarna som ska följas baserat på ett booleskt uttryck. Instruktionen switch
väljer en instruktionslista som ska köras baserat på en mönstermatchning med ett uttryck.
Instruktionen if
En if
instruktion kan vara något av följande två formulär:
En
if
-instruktion med enelse
del väljer en av de två uttryck som ska köras baserat på värdet för ett booleskt uttryck, som följande exempel visar: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!"); } }
En
if
instruktion utan enelse
del kör endast dess brödtext om ett booleskt uttryck utvärderas tilltrue
, som följande exempel visar: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}"); }
Du kan kapsla if
instruktioner för att kontrollera flera villkor, som följande exempel visar:
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}");
}
}
I en uttryckskontext kan du använda villkorsoperatorn ?:
för att utvärdera ett av de två uttrycken baserat på värdet för ett booleskt uttryck.
Instruktionen switch
Instruktionen switch
väljer en instruktionslista som ska köras baserat på en mönstermatchning med ett matchningsuttryck, som följande exempel visar:
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;
}
}
I föregående exempel använder -instruktionen switch
följande mönster:
- Ett relationsmönster: för att jämföra ett uttrycksresultat med en konstant.
- Ett konstant mönster: testa om ett uttrycksresultat är lika med en konstant.
Viktigt!
Information om de mönster som stöds av -instruktionen switch
finns i Mönster.
Föregående exempel visar också fallet default
. Fallet default
anger instruktioner som ska köras när ett matchningsuttryck inte matchar något annat skiftlägesmönster. Om ett matchningsuttryck inte matchar något skiftlägesmönster och det inte finns något default
skiftläge, faller kontrollen igenom en switch
-instruktion.
En switch
-instruktion kör instruktionslistani det första växelavsnittet vars skiftlägesmönster matchar ett matchningsuttryck och vars skiftlägesskydd, om det finns, utvärderas till true
. En switch
instruktion utvärderar skiftlägesmönster i textordning uppifrån och ned. Kompilatorn genererar ett fel när en switch
instruktion innehåller ett ärende som inte kan nås. Det är ett fall som redan hanteras av ett versaler eller vars mönster är omöjligt att matcha.
Kommentar
Ärendet default
kan visas på valfri plats i en switch
-instruktion. Oavsett position default
utvärderas ärendet endast om alla andra skiftlägesmönster inte matchas eller om -instruktionen goto default;
körs i något av växelavsnitten.
Du kan ange flera skiftlägesmönster för ett avsnitt i en switch
-instruktion, som följande exempel visar:
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;
}
}
I en switch
instruktion kan kontrollen inte falla igenom från ett växlingsavsnitt till nästa. Som exemplen i det här avsnittet visar använder du vanligtvis -instruktionen break
i slutet av varje switch-avsnitt för att skicka kontroll ut ur en switch
instruktion. Du kan också använda retur- och utkastsinstruktionernaför att skicka kontrollen från en switch
-instruktion. Om du vill imitera fall-through-beteendet och skicka kontroll till andra växelavsnitt kan du använda -instruktionengoto
.
I en uttryckskontext kan du använda switch
uttrycket för att utvärdera ett enda uttryck från en lista över kandidatuttryck baserat på en mönstermatchning med ett uttryck.
Skiftlägesskydd
Ett skiftlägesmönster kanske inte är tillräckligt uttrycksfullt för att ange villkoret för körningen av switchavsnittet. I sådana fall kan du använda ett skiftlägesskydd. Det är ett ytterligare villkor som måste uppfyllas tillsammans med ett matchat mönster. Ett skiftlägesskydd måste vara ett booleskt uttryck. Du anger ett skiftlägesskydd efter nyckelordet when
som följer ett mönster, vilket visas i följande exempel:
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;
}
}
I föregående exempel används positionsmönster med kapslade relationsmönster.
Språkspecifikation för C#
Mer information finns i följande avsnitt i C#-språkspecifikationen:
Mer information om mönster finns i avsnittet Mönster och mönstermatchning i C#-språkspecifikationen.