什么是带有OR-ing的VB.NET select case语句逻辑?

时间:2009-02-17 00:57:12

标签: vb.net syntax switch-statement

我在我的案例表达中使用Or语句。

即使我有一个在此范围内的值,但它找不到匹配项。为什么不呢?

示例代码

Select Case 2
    Case 0
        ' Some logic

    Case 1
        ' Some other logic

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

 End Select

有了上述内容,我会假设会打印hit,但情况并非如此。

6 个答案:

答案 0 :(得分:93)

使用逗号运算符分隔案例陈述

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

答案 1 :(得分:24)

正如 Jared 所说,你需要使用逗号运算符来分隔case语句。

你正在做的Or是一个按位OR,导致它为“3”。有趣的是,“2和3”可能适用于您的具体情况。

答案 2 :(得分:20)

JaredPar没错,但您也可以使用To构建

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

这将是0或1什么都不做,2或3打印命中... To构造是一个范围...

Here's the MSDN

答案 3 :(得分:10)

编辑:假设我认为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语句(在C#中切换)时,它将尝试使用查找表和 开关 MSIL指令编译它们,但是在你有类似案例1,2,11,55 编译器将无法将其转换为查找表,并且必须使用一系列比较(这类似于使用If .. Else)。

关键是,为了真正利用Select语句,案例的设计应考虑到这一点。否则,唯一的好处是代码可读性。

设计良好的开关是O(1)操作,而设计不良的开关(相当于一系列If..Then..Else语句)是O(n)操作。

答案 4 :(得分:3)

这将允许你在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

答案 5 :(得分:0)

大部分或所有这些答案都忽略了目的失败(或转到案例):

不必为同一个 Select Case/If Tree 中的几个区域重复使用代码或创建特殊函数,这样您就可以避免重复使用代码,例如这个 Javascript。

这些示例非常人为。肯定有方法可以简化这种情况,但很多时候都没有。

let pay = 100, perks = '';
Switch (EmpObj.type) {
  Case 'Boss':
    pay = pay * 10;
    perks = '11 month vacation per year';
  Case 'Manager':
    pay = pay * 3; // This will make Boss pay * 30
  Case 'Employee':
    EmpObj.pay = pay;
    EmpObj.perks = perks;
    break;
  Case 'Intern':
    EmpObj.sendMessage("Go get some coffee.")
} 

在 VB.net 中,相同的代码是

dim pay = 100, perks = "";
Switch (EmpObj.type) {
  Case "Boss":
    pay = pay * 30
    perks = "11 month vacation per year"
  Case "Manager":
    pay = pay * 3
  Case "Employee":
  Case 'Intern':
    pay = 0
    EmpObj.sendMessage("Go get some coffee.")
End Select

EmpObj.pay = pay;
EmpObj.perks = perks;

在简单情况下,案例比比较的 if 分支更容易读写,但失败是最好的部分。

至少现在有一种方法可行在 Visual Basic 2017 中。虽然它不是最漂亮的。

GoTo Case "[label]"Goto [Case-label] 仍然不起作用。

标签(此处为 Number2)必须在 Case 之后。这是最令人失望的部分。

dim Value = "1"
Select Case Value
    Case "0"
       ' do nothing, example
    Case "1"
        MsgBox("one")
        GoTo Number2
    Case "2"
Number2:
        MsgBox("two")
    Case "boolean"
        MsgBox("three")
        ' just to show it won't fall through
End Select