2008-09-09 12 views
5

Cette question est en quelque sorte d'un add-on à ce questionC# interrupteur: cas ne relevant pas dans d'autres cas Limitation

En C#, un cas de commutateur ne peut pas tomber dans d'autres cas, cela provoque une erreur de compilation. Dans ce cas, j'ajoute juste un certain nombre au total du mois pour le mois sélectionné et chaque mois suivant par la suite. (Exemple simple, pas destiné à être vrai)

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; 
} 

Y at-il une alternative logique à cela en C#, sans avoir à écrire une tonne d'instruction if?

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

Répondre

11

Souvent, lorsque vous voyez le bruit d'une énorme instruction switch ou de nombreuses instructions if qui peuvent tomber dans plus d'un bloc, vous essayez de supprimer un mauvais design. Au lieu de cela, que se passe-t-il si vous avez implémenté le modèle de spécification pour voir si quelque chose correspondait, puis agissez dessus?

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

alors vous pouvez simplement ajouter différentes caractéristiques qui correspondent à ce que vous essayez de faire.

Il est difficile de dire quel est votre domaine, donc mon exemple pourrait être un peu artificiel.

1

Il existe déjà une question portant sur ce sujet:

C# switch statement limitations - why?

EDIT:

Mon but principal en soulignant que sur, gentlebeasts, est que deux questions de nom quasi identique ajouter de la confusion au pool de questions.

+0

Ouais ... J'ai reconnu cela dans la question .... –

+1

Je ne vois pas la relation (en dehors du titre). La question 44905 porte sur l'origine de certaines limitations. Cette question concerne la manière de surmonter une limitation spécifique (qui n'est même pas mentionnée dans l'autre question). – mweerden

+2

Si vous voulez signaler qu'il y a un problème avec le titre, alors peut-être vous ne devriez pas ajouter un tag 'duplicate' mais changer le titre ou mentionner explicitement que vous pensez qu'il y a un problème. – mweerden

1

Ajoutez-vous des constantes? Si oui, peut-être quelque chose comme ça fonctionnerait (syntaxe C):

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

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

Vous pouvez faire la même chose avec des pointeurs variables ou fonction si vous avez besoin des déclarations plus complexes que d'ajouter constante aux totaux pour chaque mois suivant.

-Adam

7

Dans des déclarations C# commutateur vous pouvez tomber dans les cas que s'il n'y a pas de déclaration pour le cas où vous voulez tomber dans

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

Toutefois, si vous voulez tomber dans une déclaration vous devez utiliser la GOTO redoutée

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

Pourquoi GOTO est-il redouté? De plus, l'utilisation de "goto case" n'est pas une "instruction goto". –

+2

Je pense que l'utilisation du mot «redouté» est justifiée. Je pourrais facilement imaginer les programmeurs manquer - en utilisant le 'goto case' dans une déclaration de commutateur pour le faire sauter d'un cas à l'autre et revenir à l'affaire d'origine. Goto mène aux spaghettis, les spaghettis à la haine, la haine mène à la souffrance. Goto est le chemin vers le côté obscur. – Ben

0

Ecrire les cas de commutation dans l'ordre inverse

case 2: 

case 1: 

case 0: 

break; 


default: 

Espérons que ça aide!

+1

C# requiert toujours une instruction de contrôle de flux (break/continue/return/goto/goto/case) entre les cas si un autre code est présent. –