我最近毕业并开始了一份真正的工作。在我们的培训中,他们向我们展示了VB.NET以及他们在这里使用的许多功能。在一些示例中,他们使用了Select
语句(并且在一些地方使用了If/Else
确实应该使用的语句。
我唯一一次在其他语言中使用switch / select语句(除了需要它的赋值)时,我想要进入下一个语句。
鉴于VB.NET没有失败,有什么(如果有的话)使用Select
语句?有什么情况下它提供了优于If/ElseIf
声明的优势吗?
答案 0 :(得分:10)
Select Case
,而不仅仅是Select
对我来说,这是该语言的最佳功能之一。
当您有几个可能的值进行测试时,它会更直观。
select case some_var
case 1
something()
case 2
something_else()
case 3
etc()
end select
在测试范围时,它更具可读性:
select case some_var
case 1 to 10
something()
case 20 to 30
something_else()
case is > 100
etc()
end select
当你有一堆更复杂的条件要测试时,它会更具可读性,确保只选择一个:
select case true
case string.isnullorempty(a_string)
something()
case a_string.length < 5
something_else()
case a_string = b_string
etc()
end select
它优于C / C ++ switch
,因为它允许表达式作为分支点,而不仅仅是常量。
当使用常量作为分支点(示例1)时,编译器能够使用直接跳转生成更优化的代码。
答案 1 :(得分:6)
Select
告诉编译器,类似的If / Else块集中的每个比较(If)都在相同的值上,这使得它可以进行某些更难以确定的优化。例如,它可能更渴望生成在cpu寄存器中保存该值的机器代码(这只是假设...不同的编译器可以做他们想要的事情。)
此外,我们中的一些人发现Select
更具可读性。遵循您自己找到的任何团队或单位的编码标准非常重要。
答案 2 :(得分:4)
首先,VB确实已经失败,但这并不是那么明显。 VB中的“漏洞”只是将一个案例设置为具有多个值:
Dim number As Integer = 8
Select Case number
Case 6,7,8
' do stuff
Case Else
' do default stuff
End Select
至于它的优点,编写一个Select
语句比说三个If/ElseIf
语句更容易,这些语句都会针对相同的值进行测试。
答案 3 :(得分:1)
如果要根据输入比较/范围比较做几个不同的事情,如果是if-elseif +则使用Select
而不是疯狂的if-elseif块。
VB.NET的Select语句也有一些很酷的功能,所以要确保你知道所有的功能。
答案 4 :(得分:0)
有一种情况,Select Case可以比If更有效:当你在If条件中有一个“Or”子句列表时,你不需要全部评估它们来确定条件的真实性。假设你有一个if语句,如:
If A() Or B() Then
DoSomething()
ElseIF C() or D() Then
DoSomethingElse()
Else
DoTheDefault()
EndIF
在这种情况下,要计算第一个if语句,执行A()和B()函数,对于第二个if语句,A()和B()都是false。如果A()返回true,那么B()的值是无关紧要的,除非它以你真正想要的方式改变程序状态(通常不是很好的做法),B()的执行是多余的。编译器受到必须在结束值之前执行测试的所有部分的要求的约束(根据语言规范不允许优化测试)。
您可以将条件分成多个IfElse语句以自行优化它,但这会使代码的可读性降低,并在以后进行更改时增加出错的危险。我发现在这种情况下使用Select Case更好:
Select Case True
Case A(), B()
DoSomething()
Case C(), D()
DoSomethingElse()
Case Else
DoTheDefault()
End Select
现在,如果A()返回True,则根本不评估B()。条件的评估按列出的顺序进行,因此您可以通过将测试按最有可能返回True的顺序或执行成本最低的方式(取决于应用程序)来帮助优化代码。