web-dev-qa-db-de.com

Was ist die VB.NET select case Anweisungslogik mit case OR-ing?

Ich verwende eine oder -Anweisung in meinem case-Ausdruck.

Obwohl ich einen Wert innerhalb dieses Bereichs habe, wurde keine Übereinstimmung gefunden. Warum nicht?

Beispielcode :

Select Case 2
    Case 0
        ' Some logic

    Case 1
        ' Some other logic

    Case 2 Or 3
        Console.WriteLine("hit")

 End Select

Mit den obigen würde ich annehmen, dass hit gedruckt würde, aber das ist nicht der Fall.

53
Llyle

Verwenden Sie den Komma-Operator, um case-Anweisungen abzugrenzen

Select Case 2
    Case 0,1,2,3
        Console.WriteLine("hit")
 End Select
96
JaredPar

Wie Jared sagte, müssen Sie den Komma-Operator verwenden, um case-Anweisungen abzugrenzen.

Das Or, das Sie gemacht haben, ist ein bitweises ODER, was dazu führt, dass es "3" ist. Amüsanterweise hätte "2 AND 3" wahrscheinlich für Ihren speziellen Fall funktioniert.

24
John T

JaredPar hat es richtig, aber Sie können auch das To-Konstrukt verwenden

Select Case 2
    Case 0,1
    Case 2 To 3
        Console.WriteLine("Hit")
End Select

Dies wäre 0 oder 1 nichts zu tun, 2 oder 3 drucken Hit ... Das To-Konstrukt ist ein Bereich ...

Hier ist die MSDN

20
Jason Punyon

Edit: Anscheinend habe ich falsch angenommen, dass VB.NET keine Groß-/Kleinschreibung zulässt. Ich habe in C # und IL nachgedacht und es scheint, dass ich mich geirrt habe.

Wie jedoch jemand darauf hingewiesen hat, war der Grund, warum Ihr Code nicht funktionierte, der, dass Fall 2 oder 3 2 oder 3 als bitweise oder und daher als Fall 3 ausgewertet wurde.

Zur Klarstellung:


       2 binary = 0000 0010
       3 binary = 0000 0011
  2 Or 3 binary = 0000 0011 (= 3)

  Select Case 2
     Case 0            '--> no match

     Case 1            '--> no match

     Case 2 Or 3       '(equivalent to Case 3  --> no match)
   End Select

Ich bin jedoch der Meinung, dass ich darauf hinweisen sollte, dass man solche Konstrukte aus Gründen der Leistung nicht verwenden sollte. Wenn der Compiler auf Select-Anweisungen stößt (in C # umschalten), wird versucht, diese mithilfe von Nachschlagetabellen und der Anweisung switch MSIL zu kompilieren aber in dem Fall, wo Sie etwas wie Fall 1,2,11,55 haben, wird der Compiler nicht in der Lage sein, das in eine Nachschlagetabelle umzuwandeln und es muss eine Reihe von Vergleichen verwenden (ähnlich wie bei If .. Else).

Der Punkt ist, dass, um die Select-Anweisung wirklich auszunutzen, die Fälle unter Berücksichtigung dessen entworfen werden sollten. Ansonsten ist der einzige Vorteil die Lesbarkeit des Codes.

Ein gut gestalteter Schalter ist eine O(1) - Operation, während ein schlecht gestalteter (der einer Reihe von If..Then..Else-Anweisungen entspricht) ein O(n) Operation.

10
user67143

Auf diese Weise können Sie "etwas" bei 0 ausführen, "etwas anderes" bei 1, "schlagen" bei 2 oder 3 oder "schlagen sonst".

Select Case 2
    Case 0
        Console.WriteLine("something")
    Case 1
        Console.WriteLine("something else")
    Case Is 2 To 3
        Console.WriteLine("hit")
    Else
        Console.WriteLine("hit else")
 End Select
3
achinda99