As instruções switch têm uma longa história nas linguagens de programação. Foram introduzidas em C, onde eram apreciadas pela sua rapidez. Essa rapidez tinha como preço uma funcionalidade muito limitada. Em C#, o papel da instrução switch foi alargado para além dos inteiros. As instruções switch podem abranger qualquer tipo, valor ou referência arbitrários.
Se vens de uma linguagem funcional, trabalhar com instruções switch (e com as expressões switch abordadas noutro sítio) é o mais próximo que vais chegar, em C#, do uso de uniões discriminadas e de correspondência de padrões. No entanto, estão muito longe do poder das uniões discriminadas para garantir a segurança de tipos.
As instruções switch simples assemelham-se às suas antecessoras em C, combinando switch, case, break e default.
int direction = GetDirection();
switch (direction)
{
case 1:
GoLeft();
break;
case 2:
GoRight();
break;
default:
MarkTime();
break;
}
O padrão acima pode ser usado com qualquer tipo simples (primitivos + strings).
Quando se juntam tipos de referência à mistura, entra em jogo sintaxe adicional, primeiro para fazer a conversão descendente do tipo e depois para acrescentar guardas (when), embora as guardas também possam ser usadas com cláusulas case de valores simples. Isto é ilustrado abaixo:
Animal animal = GetAnimal();
switch(animal)
{
case Dog canine:
case Coyote canine:
canine.Bark();
break;
case Cat cat when cat.HasOnly8Lives():
cat.IsCareful();
cat.Meow();
break;
case Cat cat:
cat.Meow();
break;
}
default é opcional, mas normalmente desejável.break é obrigatória em qualquer cláusula case não vazia.case tem de derivar do tipo do argumento do switch. Um argumento do switch do tipo Object permite, obviamente, a maior variedade.case.case com argumentos case diferentes podem referir-se ao mesmo bloco de código.A documentação da instrução switch apresenta uma introdução às instruções switch.