在VB.NET中我为什么要使用Select而不是If?

时间:2011-06-30 19:42:38

标签: vb.net select if-statement language-features

我最近毕业并开始了一份真正的工作。在我们的培训中,他们向我们展示了VB.NET以及他们在这里使用的许多功能。在一些示例中,他们使用了Select语句(并且在一些地方使用了If/Else确实应该使用的语句。

我唯一一次在其他语言中使用switch / select语句(除了需要它的赋值)时,我想要进入下一个语句。

鉴于VB.NET没有失败,有什么(如果有的话)使用Select语句?有什么情况下它提供了优于If/ElseIf声明的优势吗?

5 个答案:

答案 0 :(得分:10)

Select Case,而不仅仅是Select 对我来说,这是该语言的最佳功能之一。

  1. 当您有几个可能的值进行测试时,它会更直观。

    select case some_var
    case 1
      something()
    case 2
      something_else()
    case 3
      etc()
    end select
    
  2. 在测试范围时,它更具可读性:

    select case some_var
    case 1 to 10
      something()
    case 20 to 30
      something_else()
    case is > 100
      etc()
    end select
    
  3. 当你有一堆更复杂的条件要测试时,它会更具可读性,确保只选择一个:

    select case true
    case string.isnullorempty(a_string)
      something()
    case a_string.length < 5
      something_else()
    case a_string = b_string
      etc()
    end select
    
  4. 它优于C / C ++ switch,因为它允许表达式作为分支点,而不仅仅是常量。

  5. 当使用常量作为分支点(示例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的顺序或执行成本最低的方式(取决于应用程序)来帮助优化代码。