Soms wil je één variabele vergelijken met een hele reeks vaste waarden, en
voor elke waarde iets anders doen. Met de if/else if-keuzes die je al kent,
kan dat, maar de code wordt al snel onoverzichtelijk.
Stel: een groep vrienden gaat samen op stap en krijgt korting volgens hoeveel ze met zijn allen zijn. We vragen het aantal op en bepalen de korting:
Met losse keuzes geschreven, en netjes in een else if-keten gegoten om te
vermijden dat élke voorwaarde getest wordt, ziet dat er zo uit:
int aantal;
Console.Write("Met hoeveel zijn jullie? ");
aantal = Convert.ToInt32(Console.ReadLine());
if (aantal == 1 || aantal == 2)
{
Console.WriteLine("Helaas, je krijgt geen korting");
}
else if (aantal == 3)
{
Console.WriteLine("Jullie krijgen 10% korting");
}
else if (aantal == 4)
{
Console.WriteLine("Jullie krijgen 20% korting");
}
else
{
Console.WriteLine("Jullie mogen gratis binnen");
}
Dat werkt, maar de naam aantal wordt telkens opnieuw herhaald, en bij veel
gevallen verlies je het overzicht. Voor net dit soort situaties — één
variabele die je met een rij vaste waarden vergelijkt — bestaat er een
duidelijker alternatief: het switch-statement.
In een switch schrijf je de variabele maar één keer. Daaronder som je per
case op welke waarde je verwacht en wat er dan moet gebeuren. Hetzelfde
voorbeeld als switch:
int aantal;
Console.Write("Met hoeveel zijn jullie? ");
aantal = Convert.ToInt32(Console.ReadLine());
switch (aantal)
{
case 1:
case 2:
Console.WriteLine("Helaas, je krijgt geen korting");
break;
case 3:
Console.WriteLine("Jullie krijgen 10% korting");
break;
case 4:
Console.WriteLine("Jullie krijgen 20% korting");
break;
case 5:
Console.WriteLine("Jullie krijgen 50% korting");
break;
default:
Console.WriteLine("Jullie mogen gratis binnen");
break;
}
| Onderdeel | Betekenis |
|---|---|
switch (aantal) | De variabele die je controleert. Je schrijft ze hier maar één keer. |
case 3: | Een waarde om mee te vergelijken. Is aantal gelijk aan 3, dan voert C# de code onder deze case uit. |
break; | Stopt het switch-statement. Zodra een gelijkheid gevonden is, heeft het geen zin nog verder te zoeken. |
default: | Vangt alle overige gevallen op: wanneer geen enkele case past, of de waarde ontbreekt. Vergelijkbaar met de laatste else. |
Meerdere gevallen samen. Wil je voor verschillende waarden hetzelfde doen,
dan stapel je de case-labels gewoon boven elkaar zonder er code tussen te
zetten. In het voorbeeld delen case 1: en case 2: zo dezelfde regel: bij 1
of 2 personen krijg je geen korting.
Vergeet de break; niet. Elke case (en de default) sluit je af met
break;. Die instructie onderbreekt de verdere verwerking: zodra C# een
gelijkheid ontdekt, heeft het geen zin om de volgende case-waarden nog te
testen. Daardoor loopt je programma ook iets efficiënter.
Een
switchis dus geen vervanger voor élke keuze: je gebruikt het wanneer je één variabele met een rij vaste waarden vergelijkt (zoals een aantal, een menukeuze of een maandnaam). Moet je een bereik testen (leeftijd < 5) of meerdere variabelen combineren, dan blijft deif/else if-keten de juiste keuze.