2008-09-09 12 views
5

Esta pregunta es una especie de complemento a esta questionC# interruptor: Caso de no caer a través de otros supuestos de prescripción

En C#, una caja de conmutación no puede caer a través de otros casos, esto provoca un error de compilación. En este caso, solo estoy agregando un número al total del mes para el mes seleccionado y luego cada mes subsiguiente. (Ejemplo sencillo, no pretende ser verdadera)

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 una tonelada de sentencias if?

if (month <= 0) 
    add something to month 
if (month <= 1) 
    add something to month 
if (month <= 2) 
    add something to month 
.... etc 

Respuesta

11

Muchas veces cuando se ve el ruido de una sentencia switch grande o muchos, si las declaraciones que pueda haber caído en más de un bloque, que está tratando de reprimir un mal diseño.

En cambio, lo que si que ha implementado el modelo de especificación para ver si algo igualado, y luego actuar en consecuencia?

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

entonces usted puede simplemente agregar diferentes especificaciones que coincidan con lo que está tratando de hacer.

Es difícil decir cuál es su dominio, por lo que mi ejemplo podría ser un poco artificial.

1

Ya existe una pregunta abordar este tema:

C# switch statement limitations - why?

EDIT:

Mi principal objetivo al señalar eso, gentlebeasts, es que dos cuestiones de nombre casi idéntico agregue confusión al conjunto de preguntas.

+0

Sí ... Reconocí esto en la pregunta .... –

+1

No veo la relación (aparte del título). La pregunta 44905 trata sobre los orígenes de ciertas limitaciones. Esta pregunta es sobre cómo superar una limitación específica (que ni siquiera se menciona en la otra pregunta). – mweerden

+2

Si desea señalar que hay un problema con el título, entonces quizás no deba agregar una etiqueta 'duplicate' pero cambie el título o mencione explícitamente que cree que hay un problema. – mweerden

1

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

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

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

Usted puede hacer una cosa similar con punteros variable o función si necesita instrucciones más complejas que añadir constante para los totales de cada mes siguiente.

-Adam

7

En declaraciones # C Cambiar se puede caer a través de los casos sólo si no hay ninguna declaración para el caso de que quiera caer a través

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

Sin embargo, si usted quiere caer a través de una declaración debe utilizar el GOTO temida

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

¿Por qué es temido GOTO? Además, el uso de "goto case" no es una "declaración goto". –

+2

Creo que usar la palabra "temido" está justificado. Fácilmente podría imaginarme que los programadores se equivocan al usar el 'goto case' en una declaración de cambio para saltar de un caso a otro y volver al caso original. Goto conduce al espagueti, el espagueti conduce al odio, el odio conduce al sufrimiento. Goto es el camino hacia el lado oscuro. – Ben

0

Escribir los casos de conmutación en orden inverso

case 2: 

case 1: 

case 0: 

break; 


default: 

Espero que ayude!

+1

C# aún requiere una declaración de control de flujo (break/continue/return/goto/goto case/throw) entre casos si hay otro código presente. –

Cuestiones relacionadas