繁体   English   中英

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

[英]In VB.NET why should I use Select, instead of If?

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

我唯一一次在其他语言中使用 switch/select 语句(除了需要它的分配)是当我想要下一个语句时。

鉴于 VB.NET 没有失败,有哪些(如果有)案例可以使用Select语句? 是否有任何情况下它提供优于If/ElseIf语句的优势?

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

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

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

首先,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语句都针对相同的值进行测试要容易得多。

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

VB.NET 的 Select 语句也有一些很酷的特性,因此请确保您了解所有特性。

在某些情况下,Select Case 可能比 If 更有效:当您在 If 条件中有一个“或”子句列表并且您不需要全部评估它们来确定条件的真实性时。 假设你有一个这样的 if 语句:

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

在这种情况下,为了评估第一个 if 语句,函数 A() 和 B() 都被执行,并且当 A() 和 B() 都为假时,对于第二个 if 语句也是如此。 如果 A() 返回 true,则 B() 的值无关紧要,除非它以您真正想要的方式更改程序 state(通常不是好的做法),否则 B() 的执行是多余的。 编译器受到以下要求的约束:必须在得出一个值之前执行测试的所有部分(根据语言规范,不允许优化测试)。

您可以将条件分成多个 IfElse 语句以自行优化,但这会降低代码的可读性,并增加稍后进行更改时出错的危险。 我发现在这种情况下使用 Select Case 更好:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM