[英]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
。
对我来说,这是该语言的最佳功能之一。
当您有几个可能的值要测试时,它会更加直观。
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)时,编译器能够通过直接跳转生成更优化的代码。
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.