Pregunta

Esta pregunta es una especie de complemento a esta. pregunta

En C#, un caso de cambio no puede pasar a otros casos, lo que provoca un error de compilación.En este caso, simplemente estoy agregando un número al total del mes seleccionado y a cada mes subsiguiente.(ejemplo simple, no 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 una alternativa lógica a esto en C# sin tener que escribir un montón de declaraciones if?

if (month <= 0)
   add something to month
if (month <= 1)
   add something to month
if (month <= 2)
   add something to month
.... etc
¿Fue útil?

Solución

Muchas veces, cuando ve el ruido de una declaración de cambio enorme o de muchas declaraciones if que podrían caer en más de un bloque, está tratando de suprimir un mal diseño.

En cambio, ¿qué pasaría si implementaras el patrón Especificación para ver si algo coincide y luego actuaras en consecuencia?

foreach(MonthSpecification spec in this.MonthSpecifications)
{
   if(spec.IsSatisfiedBy(month))
       spec.Perform(month);
}

luego puedes agregar diferentes especificaciones que coincidan con lo que estás intentando hacer.

Es difícil saber cuál es su dominio, por lo que mi ejemplo puede resultar un poco artificial.

Otros consejos

En las declaraciones de cambio de C#, puede pasar por casos solo si no hay ninguna declaración para el caso que desea pasar por alto.

switch(myVar)
{
   case 1:
   case 2: // Case 1 or 2 get here
      break;
}

Sin embargo, si desea fallar en una declaración, debe utilizar el temido GOTO.

switch(myVar)
    {
       case 1: // Case 1 statement
               goto case 2;
       case 2: // Case 1 or 2 get here
          break;
    }

¿Estás agregando constantes?Si es así, tal vez algo como esto funcione (sintaxis C):

const int addToTotals[] = {123, 456, ..., 789};

for(i=month;i<12;i++)
   totals += addToTotals[i];

Puede hacer algo similar con punteros de variables o funciones si necesita declaraciones más complejas que sumar constantes a los totales de cada mes siguiente.

-Adán

Ya hay una pregunta que aborda este tema:

Limitaciones de las declaraciones de cambio de C#: ¿por qué?

EDITAR:

Mi objetivo principal al señalar esto, caballeros, es que dos preguntas con nombres casi idénticos añaden confusión al conjunto de preguntas.

Escribe las cajas de los interruptores en orden inverso.

case 2:

case 1:

case 0:

break;


default:

¡Espero que ayude!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top