Selectie-instructies - if
, if-else
en switch
De if
en if-else
switch
instructies selecteren instructies die moeten worden uitgevoerd vanuit veel mogelijke paden op basis van de waarde van een expressie. De if
instructie voert alleen een instructie uit als een opgegeven Boole-expressie resulteert in true
. if-else
Met de instructie kunt u kiezen welke van de twee codepaden u wilt volgen op basis van een Boole-expressie. Met switch
de instructie wordt een instructielijst geselecteerd die moet worden uitgevoerd op basis van een patroonovereenkomst met een expressie.
De if
instructie
Een if
instructie kan een van de volgende twee vormen zijn:
Een
if
instructie met eenelse
onderdeel selecteert een van de twee instructies die moeten worden uitgevoerd op basis van de waarde van een Boole-expressie, zoals in het volgende voorbeeld wordt weergegeven: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!"); } }
Een
if
instructie zonderelse
onderdeel voert alleen de hoofdtekst uit als een Boole-expressie resulteert in een booleaansetrue
expressie, zoals in het volgende voorbeeld wordt weergegeven: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}"); }
U kunt instructies nesten if
om meerdere voorwaarden te controleren, zoals in het volgende voorbeeld wordt weergegeven:
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}");
}
}
In een expressiecontext kunt u de voorwaardelijke operator ?:
gebruiken om een van de twee expressies te evalueren op basis van de waarde van een Boole-expressie.
De switch
instructie
De switch
instructie selecteert een instructielijst die moet worden uitgevoerd op basis van een patroonovereenkomst met een overeenkomstexpressie, zoals in het volgende voorbeeld wordt weergegeven:
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;
}
}
In het voorgaande voorbeeld gebruikt de switch
instructie de volgende patronen:
- Een relationeel patroon: een expressieresultaat vergelijken met een constante.
- Een constant patroon: test of een expressieresultaat gelijk is aan een constante.
Belangrijk
Zie Patronen voor informatie over de patronen die door de switch
instructie worden ondersteund.
In het voorgaande voorbeeld ziet u ook de default
case. In de default
case worden instructies opgegeven die moeten worden uitgevoerd wanneer een overeenkomstexpressie niet overeenkomt met een ander casepatroon. Als een overeenkomstexpressie niet overeenkomt met een casepatroon en er geen default
case is, valt het besturingselement door een switch
instructie.
Met een switch
instructie wordt de lijst met instructies uitgevoerd in de eerste switchsectie waarvan het casepatroon overeenkomt met een overeenkomstexpressie en waarvan de case guard, indien aanwezig, resulteert in true
. Een switch
instructie evalueert hoofdletterpatronen in tekstvolgorde van boven naar beneden. De compiler genereert een fout wanneer een switch
instructie een onbereikbare case bevat. Dat is een geval dat al wordt verwerkt door een hoofdletter of waarvan het patroon onmogelijk is om overeen te komen.
Notitie
De default
case kan op elke plaats binnen een switch
instructie worden weergegeven. Ongeacht de positie ervan wordt de default
case alleen geëvalueerd als alle andere casepatronen niet overeenkomen of de goto default;
instructie wordt uitgevoerd in een van de switchsecties.
U kunt meerdere casepatronen opgeven voor één sectie van een switch
instructie, zoals in het volgende voorbeeld wordt weergegeven:
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;
}
}
Binnen een switch
instructie kan het besturingselement niet van de ene schakelsectie naar de volgende vallen. Zoals in de voorbeelden in deze sectie wordt weergegeven, gebruikt u meestal de break
instructie aan het einde van elke switchsectie om het besturingselement uit een switch
instructie door te geven. U kunt ook de retour- en throw-instructies gebruiken om controle uit een switch
instructie door te geven. Als u het fallthrough-gedrag wilt imiteren en het besturingselement wilt doorgeven aan een andere switchsectie, kunt u de goto
instructie gebruiken.
In een expressiecontext kunt u de switch
expressie gebruiken om één expressie te evalueren uit een lijst met kandidaat-expressies op basis van een patroonovereenkomst met een expressie.
Case guards
Een casepatroon kan niet expressief genoeg zijn om de voorwaarde op te geven voor de uitvoering van de switchsectie. In dat geval kunt u een case guard gebruiken. Dat is een extra voorwaarde waaraan moet worden voldaan, samen met een overeenkomend patroon. Een case guard moet een Boole-expressie zijn. U geeft een hoofdletterbeveiliging op na het when
trefwoord dat een patroon volgt, zoals in het volgende voorbeeld wordt weergegeven:
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;
}
}
In het voorgaande voorbeeld worden positionele patronen met geneste relationele patronen gebruikt.
C#-taalspecificatie
Zie de volgende secties van de C#-taalspecificatie voor meer informatie:
Zie de sectie Patronen en patroonkoppeling van de C#-taalspecificatie voor meer informatie over patronen.