我在 case 表达式中使用了Or语句。
即使我在此范围内有一个值,它也没有找到匹配项。为什么不?
示例代码:
Select Case 2
Case 0
' Some logic
Case 1
' Some other logic
Case 2 Or 3
Console.WriteLine("hit")
End Select
有了上面的内容,我会假设hit
会被打印出来,但事实并非如此。
我在 case 表达式中使用了Or语句。
即使我在此范围内有一个值,它也没有找到匹配项。为什么不?
示例代码:
Select Case 2
Case 0
' Some logic
Case 1
' Some other logic
Case 2 Or 3
Console.WriteLine("hit")
End Select
有了上面的内容,我会假设hit
会被打印出来,但事实并非如此。
使用逗号运算符分隔 case 语句
Select Case 2
Case 0,1,2,3
Console.WriteLine("hit")
End Select
正如Jared所说,您需要使用逗号运算符来分隔 case 语句。
你正在做的Or
是一个按位或,导致它是“3”。有趣的是,“2 AND 3”可能适用于您的具体情况。
JaredPar 是对的,但您也可以使用 To 构造
Select Case 2
Case 0,1
Case 2 To 3
Console.WriteLine("Hit")
End Select
这将是 0 或 1 什么都不做,2 或 3 打印 Hit...To 构造是一个范围...
编辑: 假设 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# 中的 switch)时,它会尝试使用查找表和switch MSIL 指令来编译它们,但在你有类似情况 1、2、11、55的情况下,编译器将无法转换到一个查找表,它必须使用一系列比较(这就像使用 If.. Else)。
关键是,为了真正利用 Select 语句,在设计案例时应该考虑到这一点。否则,唯一的好处是代码可读性。
设计良好的开关是 O(1) 操作,而设计不佳的开关(相当于一系列 If..Then..Else 语句)是 O(n) 操作。
这将允许您在 0 的情况下执行“something”,在 1 的情况下执行“something else”,在 2 或 3 的情况下执行“hit”或“hit else”。
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
不必重用代码或只为同一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;
在简单的情况下,case 比比较 if-branch 更容易读写,但 fall-through 是最好的部分。
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