Подтвердить что ты не робот

Что такое логика case case VB.NET с аргументом OR-ing?

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

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

Пример кода:

Select Case 2
    Case 0
        ' Some logic

    Case 1
        ' Some other logic

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

 End Select

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

JaredPar имеет это право, но вы также можете использовать конструкцию

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

Это будет 0 или 1 ничего не делать, 2 или 3 печати Хит... Для построения является диапазон...

Здесь MSDN

Ответ 4

Изменить: Похоже, я ошибался, полагая, что VB.NET не разрешает Case ORing. Я думал в С# и 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 на С#), он попытается скомпилировать их с помощью таблиц поиска и команды MSIL switch, но в случае, если у вас есть что-то вроде Case 1,2,11,55, компилятор не сможет преобразовать это в таблицу поиска, и ему придется использовать серию сравнений (что похоже на использование If.. Else).

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

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

Ответ 5

Это позволит вам выполнить "что-то" в случае "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