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
Était-ce utile?

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!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top