Wenn Bedingung in Switch-Fall [Duplizieren]

8

Ich versuche eine if-Anweisung zu konvertieren, um Fälle (für Lesbarkeit)

zu wechseln

1) Ich habe gelesen, dass Switch-Statements im Allgemeinen schrecklich sind - Stimmt das? Ссылка

2) Die Aussage geht so:

%Vor%

Fehler ist:

  

Die Steuerung kann nicht von einem Case-Label ('Fall 1:') zu einem anderen

durchfallen

Dies ist die ursprüngliche if-Anweisung:

%Vor%     
AngelicCore 01.04.2013, 11:29
quelle

8 Antworten

7

Der Compiler wird nicht verstehen, was Sie hier meinen.

%Vor%

Der Compiler verbindet die Punkte nicht und versteht, dass die break; -Anweisung innerhalb Ihrer if -Anweisung mit der switch -Anweisung verknüpft ist. Stattdessen versucht es, es mit einer Schleife zu verknüpfen, da break; -Anweisungen allein nur mit Schleifen verwendet werden können, um daraus auszubrechen.

Das bedeutet, dass Ihr case -Baustein seine break -Anweisung zur Vervollständigung fehlt, und der Compiler sich beschwert.

Anstatt zu versuchen, den Code aus einer switch -Anweisung zu entfernen, würde ich stattdessen Ihre ursprüngliche if -Anweisung auflösen.

Das gehört Ihnen:

%Vor%

So würde ich es schreiben:

%Vor%

Sie haben nicht , um alles in einer Zeile zu packen.

Ich würde auch versuchen, Eigenschaften so zu benennen, dass sie einfacher zu lesen sind. Ich würde die Eigenschaft EXPENSE in IsExpense umbenennen, so dass der obige Code wie folgt gelesen würde:

%Vor%

Dann würde ich im Idealfall die Sub-Ausdrücke zu Methoden umdefinieren:

%Vor%

Dann können Sie den Ausdruck wieder in die if-Anweisung einfügen:

%Vor%

Dies sollte einfacher zu lesen und später ändern.

    
Lasse Vågsæther Karlsen 01.04.2013, 11:40
quelle
12

Zunächst bemerke ich, dass Sie vergessen haben, in Ihrem zweiten Punkt eine Frage zu stellen. Also werde ich einige Fragen stellen, die Sie an Ihren zweiten Punkt richten:

  

Was bedeutet der Fehler "Kann nicht durchfallen"?

Im Gegensatz zu C und C ++ erlaubt C # kein versehentliches Durchlaufen von einem Switch-Bereich zu einem anderen. Jeder Schaltabschnitt muss einen "unerreichbaren Endpunkt" haben; Es sollte mit einem Break, Goto, Return, Throw oder (selten) Endlosschleife enden.

Dies verhindert den häufigen Fehler des Vergessens, die Pause einzulegen und versehentlich "durchzufallen".

Sie haben Ihren Code so geschrieben, als ob der Durchgriff legal ist; Meine Vermutung ist, dass Sie ein C-Programmierer sind.

  

Wie kann ich Durchgriff in C # erzwingen?

So:

%Vor%

Nun kann der Erreichbarkeitsanalysator feststellen, dass unabhängig davon, welcher Zweig des "if" ist, der Endpunkt des Schalterabschnitts nicht erreichbar ist.

  

Ist das ein guter Stil?

Nein. Ihr ursprünglicher Code war viel besser lesbar.

  

Ich habe gelesen, dass Switch-Statements im Allgemeinen schrecklich sind - Stimmt das?

Meinungen variieren. Switch-Anweisungen sind sehr nützlich, wenn es eine kleine Anzahl sehr "knackiger" Alternativen gibt, deren Verhalten nicht auf komplexe Weise interagiert. Einige Leute werden Ihnen sagen, dass Switched Logik sollte stattdessen durch virtuelle Methoden oder Besucher Muster behandelt werden, aber das kann auch missbraucht werden.

  

Sollte ich in diesem speziellen Fall einen Schalter verwenden?

Ich würde nicht.

  

Wie würden Sie meinen Code verbessern?

%Vor%

Als Erstes sollten Sie in C # keine Dinge IN ALLEN CAPs nennen.

Zweitens, boolesche Werte nicht mit wahr und falsch vergleichen. Sie sind schon Booleans! Wenn du die Wahrheit von Aussage X wissen willst, würdest du nicht auf Englisch sagen "ist es wahr, dass X wahr ist?" Du würdest sagen "Ist X wahr?"

Ich würde wahrscheinlich schreiben:

%Vor%

Oder, noch besser, ich würde den Test in eine eigene Methode abstrahieren:

%Vor%

Oder abstrahiere das Ganze weg:

%Vor%     
Eric Lippert 01.04.2013 15:19
quelle
5

Verwenden Sie if-Anweisungen und extrahieren Sie komplexe Bedingungen in Methoden, z. B.

%Vor%

Denken Sie immer an OOP und Polymorphismus, wenn Sie einen solchen "Schalter" schreiben und einen weiteren hinzufügen Fall zu diesem Code wird ein Albtraum

sein

siehe dies und ähnliche (C ++) Anweisungen zum Konvertieren von Schaltern

PS Wenn Sie daran interessiert sind, Ihren Code sauber und lesbar zu machen, lesen Sie Smalltalk Best Practice Patterns von Kent Beck und / oder Clean Code von Uncle Bob Ich habe beide sehr genossen, sehr zu empfehlen.

    
illegal-immigrant 01.04.2013 11:37
quelle
3

Wenn Sie Lesbarkeit möchten, werfen Sie einfach Ihren Syntax-Papierkorb weg:

%Vor%     
Dennis 01.04.2013 11:34
quelle
2

Geben Sie den else -Teil für jeden von ihnen an, damit es keinen Fehler auslöst, aber wie andere sagen, brauchen Sie in diesem Fall tatsächlich nicht switch .

%Vor%     
Hossein Narimani Rad 01.04.2013 11:33
quelle
1

Der Grund, warum Sie diesen Fehler erhalten, besteht darin, dass Sie break -Anweisungen nicht definieren.

Sie haben break bedingt definiert.

%Vor%

Stellen Sie entweder sicher, dass jede case-Anweisung ihre eigene break hat oder gruppieren Sie die case-Anweisungen wie folgt.

%Vor%     
bas 01.04.2013 11:43
quelle
0

Refaktorieren Sie die if -Anweisungen, damit Sie es so ausdrücken können:

%Vor%

Die extrahierte Logik:

%Vor%     
Matthew Watson 01.04.2013 11:39
quelle
0

Stimmen Sie mit Dennis überein, Sie möchten keinen Schalter für dieses Problem.

Obwohl wahrscheinlich weniger lesbar, können Sie auch kürzere verwenden:

%Vor%     
publicgk 01.04.2013 11:47
quelle