Frage

Diese Frage ist eine Art Ergänzung dazu Frage

In C# kann ein Switch-Fall nicht auf andere Fälle übertragen werden, da dies zu einem Kompilierungsfehler führt.In diesem Fall füge ich lediglich eine Zahl zur Monatssumme für den ausgewählten Monat und jeden darauffolgenden Monat hinzu.(einfaches Beispiel, soll nicht real sein)

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

Gibt es in C# eine logische Alternative dazu, ohne eine Menge if-Anweisungen schreiben zu müssen?

if (month <= 0)
   add something to month
if (month <= 1)
   add something to month
if (month <= 2)
   add something to month
.... etc
War es hilfreich?

Lösung

Wenn Sie das Rauschen einer großen switch-Anweisung oder vieler if-Anweisungen sehen, die möglicherweise in mehr als einen Block fallen, versuchen Sie oft, ein schlechtes Design zu unterdrücken.

Was wäre, wenn Sie stattdessen das Spezifikationsmuster implementieren würden, um zu sehen, ob etwas übereinstimmt, und dann entsprechend zu handeln?

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

Dann können Sie einfach verschiedene Spezifikationen addieren, die zu dem passen, was Sie tun möchten.

Es ist schwer zu sagen, um welche Domain es sich handelt, daher könnte mein Beispiel etwas gekünstelt sein.

Andere Tipps

In C#-Switch-Anweisungen können Sie Fälle nur dann durchgehen, wenn es keine Anweisung für den Fall gibt, den Sie durchgehen möchten

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

Wenn Sie jedoch mit einer Aussage scheitern wollen, müssen Sie das gefürchtete GOTO verwenden

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

Fügen Sie Konstanten hinzu?Wenn ja, würde vielleicht so etwas funktionieren (C-Syntax):

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

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

Ähnliches können Sie mit Variablen- oder Funktionszeigern tun, wenn Sie komplexere Anweisungen benötigen, als für jeden folgenden Monat Konstanten zu den Gesamtsummen hinzuzufügen.

-Adam

Es gibt bereits eine Frage zu diesem Thema:

Einschränkungen der C#-Switch-Anweisung – warum?

BEARBEITEN:

Der Hauptgrund, warum ich darauf hinweise, meine lieben Biester, besteht darin, dass zwei Fragen mit nahezu identischem Namen den Fragenpool noch verwirrender machen.

Schreiben Sie die Schalterfälle in umgekehrter Reihenfolge

case 2:

case 1:

case 0:

break;


default:

Hoffentlich hilft das!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top