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
Foi útil?

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!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top