Chave C#:caso não se enquadrando na limitação de outros casos
-
09-06-2019 - |
Pergunta
Esta pergunta é uma espécie de complemento para isso pergunta
Em C#, um caso de switch não pode passar para outros casos, o que causa um erro de compilação.Nesse caso, estou apenas adicionando algum número ao total do mês selecionado e de cada mês subsequente.(exemplo simples, não pretende ser real)
switch (month)
{
case 0:
add something to month totals
case 1:
add something to month totals
case 2:
add something to month totals
default:
break;
}
Existe uma alternativa lógica para isso em C# sem ter que escrever uma tonelada de instruções if?
if (month <= 0)
add something to month
if (month <= 1)
add something to month
if (month <= 2)
add something to month
.... etc
Solução
Muitas vezes, quando você vê o ruído de uma instrução switch enorme ou de muitas instruções if que podem cair em mais de um bloco, você está tentando suprimir um design incorreto.
Em vez disso, e se você implementasse o padrão Especificação para ver se algo correspondia e então agisse de acordo?
foreach(MonthSpecification spec in this.MonthSpecifications)
{
if(spec.IsSatisfiedBy(month))
spec.Perform(month);
}
então você pode simplesmente adicionar especificações diferentes que correspondam ao que você está tentando fazer.
É difícil dizer qual é o seu domínio, então meu exemplo pode ser um pouco artificial.
Outras dicas
Nas instruções switch C#, você pode passar por casos somente se não houver nenhuma instrução para o caso que você deseja passar
switch(myVar)
{
case 1:
case 2: // Case 1 or 2 get here
break;
}
No entanto, se você quiser falhar com uma declaração, você deve usar o temido GOTO
switch(myVar)
{
case 1: // Case 1 statement
goto case 2;
case 2: // Case 1 or 2 get here
break;
}
Você está adicionando constantes?Nesse caso, talvez algo assim funcionasse (sintaxe C):
const int addToTotals[] = {123, 456, ..., 789};
for(i=month;i<12;i++)
totals += addToTotals[i];
Você pode fazer algo semelhante com ponteiros de variáveis ou funções se precisar de instruções mais complexas do que adicionar constantes aos totais de cada mês seguinte.
-Adão
Já existe uma pergunta abordando este tópico:
Limitações da instrução switch C # - por quê?
EDITAR:
Meu principal objetivo ao apontar isso, gentis, é que duas perguntas de nomes quase idênticos adicionam confusão ao conjunto de perguntas.
Escreva os casos de switch na ordem inversa
case 2:
case 1:
case 0:
break;
default:
Espero que ajude!