Lly*_*yle 53 vb.net syntax switch-statement
我在我的case表达式中使用了Or语句.
即使我有一个在此范围内的值,它也找不到匹配项.为什么不?
示例代码:
Select Case 2
Case 0
' Some logic
Case 1
' Some other logic
Case 2 Or 3
Console.WriteLine("hit")
End Select
Run Code Online (Sandbox Code Playgroud)
有了上面我会假设hit
将打印,但事实并非如此.
Jar*_*Par 96
使用逗号运算符分隔case语句
Select Case 2
Case 0,1,2,3
Console.WriteLine("hit")
End Select
Run Code Online (Sandbox Code Playgroud)
Jas*_*yon 20
JaredPar没错,但您也可以使用To构造
Select Case 2
Case 0,1
Case 2 To 3
Console.WriteLine("Hit")
End Select
Run Code Online (Sandbox Code Playgroud)
这将是0或1什么都不做,2或3打印命中... To构造是一个范围...
use*_*143 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)
Run Code Online (Sandbox Code Playgroud)
Select Case 2
Case 0 '--> no match
Case 1 '--> no match
Case 2 Or 3 '(equivalent to Case 3 --> no match)
End Select
Run Code Online (Sandbox Code Playgroud)
但是,我觉得我应该指出,为了表现,不应该使用这样的结构.当编译器遇到Select语句(在C#中切换)时,它将尝试使用查找表和切换 MSIL指令编译它们,但是如果你有类似案例1,2,11,55的情况,编译器将无法转换到查找表,它将不得不使用一系列比较(这就像使用If .. Else).
关键是,为了真正利用Select语句,应该考虑到这些案例.否则,唯一的好处是代码可读性.
设计良好的开关是O(1)操作,而设计不良的开关(相当于一系列If..Then..Else语句)是O(n)操作.