Commutateur C# :cas ne relevant pas des autres cas limitation
-
09-06-2019 - |
Question
Cette question est en quelque sorte un complément à celle-ci question
En C#, un cas de commutation ne peut pas passer à d'autres cas, cela provoque une erreur de compilation.Dans ce cas, j'ajoute simplement un nombre au total du mois pour le mois sélectionné et pour chaque mois suivant par la suite.(exemple simple, pas censé être réel)
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-t-il une alternative logique à cela en C# sans avoir à écrire une tonne d'instructions if ?
if (month <= 0)
add something to month
if (month <= 1)
add something to month
if (month <= 2)
add something to month
.... etc
La solution
Souvent, lorsque vous voyez le bruit d'une énorme instruction switch ou de nombreuses instructions if pouvant tomber dans plusieurs blocs, vous essayez de supprimer une mauvaise conception.
Au lieu de cela, que se passerait-il si vous implémentiez le modèle de spécification pour voir si quelque chose correspondait, puis agissez en conséquence ?
foreach(MonthSpecification spec in this.MonthSpecifications)
{
if(spec.IsSatisfiedBy(month))
spec.Perform(month);
}
alors vous pouvez simplement ajouter différentes spécifications qui correspondent à ce que vous essayez de faire.
Il est difficile de déterminer quel est votre domaine, mon exemple est donc peut-être un peu artificiel.
Autres conseils
Dans les instructions switch C#, vous ne pouvez ignorer les cas que s'il n'y a aucune instruction pour le cas que vous souhaitez ignorer
switch(myVar)
{
case 1:
case 2: // Case 1 or 2 get here
break;
}
Cependant, si vous voulez échouer avec une déclaration, vous devez utiliser le redoutable GOTO
switch(myVar)
{
case 1: // Case 1 statement
goto case 2;
case 2: // Case 1 or 2 get here
break;
}
Ajoutez-vous des constantes ?Si tel est le cas, peut-être que quelque chose comme ceci fonctionnerait (syntaxe C) :
const int addToTotals[] = {123, 456, ..., 789};
for(i=month;i<12;i++)
totals += addToTotals[i];
Vous pouvez faire une chose similaire avec des pointeurs de variable ou de fonction si vous avez besoin d'instructions plus complexes que d'ajouter une constante aux totaux pour chaque mois suivant.
-Adam
Il y a déjà une question traitant de ce sujet :
Limitations des instructions de commutation C# – pourquoi ?
MODIFIER:
Mon objectif principal en soulignant cela, messieurs les bêtes, est que deux questions portant un nom presque identique ajoutent de la confusion à l'ensemble des questions.
Écrivez les cas de commutation dans l'ordre inverse
case 2:
case 1:
case 0:
break;
default:
J'espère que cela pourra aider!