57 votes

Qu'est-ce que la logique d'instruction VB.NET Select Case avec case OR-ing

En écrivant du code vb, j'ai trébuché et je me demande toujours pourquoi. Je répondais aux attentes du cas, mais une valeur se situant dans cette fourchette ne justifiait pas une correspondance; pourquoi pas?

Exemple de code:

     Select Case 2
        Case 0
            ''// Some logic
        Case 1
            ''// Some other logic
        Case 2 Or 3
            Console.WriteLine("hit")
     End Select
 

Avec ce qui précède, je supposerais naturellement que "hit" serait imprimé, mais ce n'est pas le cas.

100voto

JaredPar Points 333733

Utilisez l'opérateur virgule pour délimiter les instructions de cas

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

24voto

John T Points 285

Comme Jared * l'a dit, vous devez utiliser l'opérateur virgule pour délimiter les instructions de cas.

Le ou que vous faisiez est un OU au niveau du bitwise, le résultat étant "3". Curieusement, "2 AND 3" aurait probablement fonctionné pour votre cas spécifique.

* Je ne peux pas voter avec mon représentant chétif, désolé!

21voto

Jason Punyon Points 21244

JaredPar a raison mais vous pouvez aussi utiliser la construction To

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

Ce serait 0 ou 1 ne rien faire, 2 ou 3 empreintes de frappe ... La construction de Pour est une plage ...

Voici le MSDN

10voto

user67143 Points 239

Edit: Il semble que j'ai eu tort de supposer que VB.NET n'autorise pas le Cas ORing. Je pense, en C# et IL et il semble que j'avais tort.

Cependant, comme quelqu'un l'a souligné, la raison de votre code n'a pas de travail était parce que les Cas 2 Ou 3 a été évalué à 2 Ou 3 comme un or et donc l'évaluation de Cas 3.

Pour plus de précision:


       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

Cependant, je pense que je me dois de souligner que, pour des raisons de performances, il ne faut pas utiliser de telles constructions. Lorsque le compilateur rencontre Select (C#), il va essayer de les compiler en utilisant des tables et le commutateur MSIL instruction, mais dans le cas où vous avez quelque chose comme Cas 1,2,11,55 le compilateur ne sera pas en mesure de convertir un tableau de recherche et il faudra utiliser une série de comparaisons (qui est comme l'utilisation de if.. Else).

Le point est que pour vraiment profiter de l'instruction Select, les cas doivent être conçus dans cet esprit. Sinon, le seul avantage est la lisibilité du code.

Un commutateur est un O(1) opération alors qu'un mal conçu (ce qui est équivalent à une série de if..then..Else) est un O(n) opérations.

3voto

achinda99 Points 2799

Cela vous permettra d'effectuer "quelque chose" dans le cas de 0, "quelque chose d'autre" dans le cas de 1, "hit" dans le cas de 2 ou 3 ou "hit else" dans le cas contraire.

 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
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X