Какова логика оператора выбора в VB.NET с регистром ИЛИ? - PullRequest
53 голосов
/ 17 февраля 2009

Я использую оператор или в своем выражении.

Несмотря на то, что у меня есть значение в этом диапазоне, оно не нашло соответствия. Почему нет?

Пример кода :

Select Case 2
    Case 0
        ' Some logic

    Case 1
        ' Some other logic

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

 End Select

С учетом вышесказанного я бы предположил, что будет напечатано hit, но это не так.

Ответы [ 5 ]

93 голосов
/ 17 февраля 2009

Используйте оператор запятой для разграничения операторов регистра

Select Case 2
    Case 0,1,2,3
        Console.WriteLine("hit")
 End Select
24 голосов
/ 17 февраля 2009

Как сказал Джаред , необходимо использовать оператор запятой для разграничения операторов регистра.

Or, который вы делали, является побитовым ИЛИ, в результате чего он равен "3". Забавно, но «2 И 3», вероятно, сработали бы для вашего конкретного случая.

20 голосов
/ 17 февраля 2009

JaredPar имеет право, но вы также можете использовать для построения

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

Это будет 0 или 1, ничего не делать, 2 или 3, печать Hit ... Конструкция To - это диапазон ...

Вот MSDN

10 голосов
/ 17 февраля 2009

Редактировать: Похоже, я ошибался, предполагая, что VB.NET не позволяет Case ORing. Я думал на C # и IL, и, похоже, я ошибался.

Однако, как кто-то указал, причина, по которой ваш код не работал, заключалась в том, что в случае 2 или 3 оценка 2 или 3 была побитовой или, следовательно, в случае 3.

Для уточнения:


       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

Однако я чувствую, что должен отметить, что ради производительности не следует использовать такие конструкции. Когда компилятор встречает операторы Select (switch в C #), он попытается скомпилировать их, используя таблицы поиска и инструкцию switch MSIL, но в случае, когда у вас есть что-то вроде Case 1,2,11,55 компилятор не сможет преобразовать это в таблицу поиска, и ему придется использовать серию сравнений (что аналогично использованию If .. Else).

Суть в том, что для того, чтобы действительно воспользоваться предложением Select, случаи должны быть разработаны с учетом этого. В противном случае единственным преимуществом является удобочитаемость кода.

Хорошо спроектированный переключатель - это операция O (1), тогда как плохо спроектированный (который эквивалентен серии операторов If..Then..Else) - это операция O (n).

3 голосов
/ 17 февраля 2009

Это позволит вам выполнить «что-то» в случае 0, «что-то еще» в случае 1, «удар» в случае 2 или 3 или «ударить еще» в противном случае.

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
...