什么是案例OR-ing的VB.NETselect案例语句逻辑?

我在我的例子expression式中使用了一个Or语句。

即使我有这个范围内的价值,它没有find一个匹配。 为什么不?

示例代码

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

有了上面的内容,我会认为打印会被打印,但事实并非如此。

使用逗号运算符来划分case语句

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

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

Or你正在做的是一个按位或,导致它是“3”。 有趣的是,“2和3”可能会适合你的具体情况。

JaredPar有它的权利,但你也可以使用To构造

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

这将是0或1什么也不做,2或3打印命中…该构造是一个范围…

这是MSDN

编辑:这似乎是错误的假设VB.NET不允许案例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语句,应该考虑到这种情况。 否则,唯一的好处是代码的可读性。

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

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