2011-06-30 97 views
3

我刚刚毕业并开始了一份真正的工作。在我们的培训中,他们向我们展示了VB.NET以及他们在这里使用的许多功能。在一些例子中,他们已经使用Select语句(并且在一些地方他们被用于确实应该使用If/Else的地方)。在VB.NET中,为什么我应该使用Select而不是If?

当我希望下降到下一个语句时,唯一一次使用其他语言的switch/select语句(除了需要它的赋值语句)。

鉴于VB.NET没有失败,有什么(如果有的话)的情况下使用Select声明?有没有什么情况可以提供优于陈述和If/ElseIf陈述?

回答

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)时,编译器能够通过直接跳转生成更优化的代码。

+2

我完全没有意识到你可以测试范围,以及'选择案例' –

+1

+1的很多好的论点,因为强调'选择案例',因为'Select'是LINQ。 – Neolisk

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声明,对相同的所有测试值。

+1

这不是现在,现在呢?它大部分覆盖了它,但它仍然不是相同的功能。 –

+0

@dr。邪恶 - 为了所有的意图和目的,它是贯穿始终的。它更像是一个安全网,而不是一个安全网。基本上,你不能无意中在C#中通过忘记'break'来创建类似于'# – Jason

+0

'我不知道我是否会考虑真正的漏洞,因为在C++中你可以在一个C++中运行一些操作案例 - 可能会消耗一些东西。我看到的最好的例子是从整数转换为罗马数字,但现在找不到链接。 –

6

Select告诉编译器If/Else块的类似集合中的每个比较(If)都在相同的值上,并且这允许它进行某些优化,否则难以确定。例如,它可能更渴望生成将该值保存在cpu寄存器中的机器代码(这只是假设......不同的编译器可以做他们想做的)。

此外,我们中的一些人发现Select更具可读性。遵循您发现的任何团队或单位的编码标准非常重要。

1

如果你打算根据输入比较/范围比较做几件不同的事情,如果它是if-elseif +,那么使用Select而不是疯狂的if-elseif块。

VB.NET的Select语句也有一些很酷的功能,所以确保你知道所有的功能。

+0

C#中不是什么好习惯? –

+0

使用通过做疯狂开关的东西(我不是指支持多个值,这是正常的) –

+2

邪恶:除了指定多个值C#不允许情况下通过。如果你想去另一个案例,你必须手动'goto case'进去。 –

0

存在的情况下选择情况下,可以更有效的比,如果:当你在If条件“或”条款清单,你不需要评估所有这些建立的真相条件。假设有一个if语句如此:

If A() Or B() Then 
    DoSomething() 
ElseIF C() or D() Then 
    DoSomethingElse() 
Else 
    DoTheDefault() 
EndIF 

在这种情况下,为了评估所述第一if语句,这两个函数A()和B()被执行,并且类似地对于第二if语句时A( )和B()都是假的。如果A()返回true,那么B()的值是不重要的,除非它以你实际需要的方式改变程序状态(通常不是好的做法),否则B()的执行是多余的。编译器受限于测试的所有部分必须在结束一个值之前执行(根据语言规范不允许优化测试)。

您可以将条件分隔成多个IfElse语句来自行优化它,但这会使代码变得不易读,并且会在稍后进行更改时增加错误的危险。我发现,使用选择案例是在这种情况下更好:

Select Case True 
    Case A(), B() 
     DoSomething() 
    Case C(), D() 
     DoSomethingElse() 
    Case Else 
     DoTheDefault() 
End Select 

现在,如果A()返回true,则B()是不是在所有的评估。对条件的评估按照列出的顺序进行,因此您可以通过将测试按照最可能返回True或最低成本执行的顺序(取决于应用程序)进行优化来帮助优化代码。

+1

您还可以将'Or'更改为'OrElse'以通过'If/Else'实现相同的行为。尽管如此,+1你的努力清楚地解释了一切。 – Neolisk

相关问题