选择Case True

Otá*_*cio 18 vb.net vb6 vba

显然,这曾经是VB6和VBA短路并执行第一个真实情况的一种方式:

Select Case True
End Select
Run Code Online (Sandbox Code Playgroud)

这仍然在使用(VB.NET)?

Cha*_*rch 29

通常使用此语法而不是If...ElseIf语句.有些人发现它更容易阅读.例如:

Select Case True
    Case testVariable < 0
         Console.Write("You must supply a positive value.")
    Case testVariable > 10
         Console.Write("Please enter a number from 0-10.")
    Case True
         Call DoWork(testVariable)
End Select
Run Code Online (Sandbox Code Playgroud)

答案是肯定的,这仍然适用于VB.NET.在使用它时要小心,因为它不是"标准编程结构",对于将来必须维护代码的人来说可能不熟悉.


Pat*_*ald 13

我不确定这个结构如何提供以下优势:

If testVariable < 0 Then
     Console.Write("You must supply a positive value.")
ElseIf testVariable > 10 Then
     Console.Write("Please enter a number less than 10.")
Else
     Call DoWork(testVariable)
End If
Run Code Online (Sandbox Code Playgroud)

上面的结构是短路的,我不必尝试弄清楚它的作用,因为它是一个标准结构.


Rol*_*ble 11

其他人已经回答了这个实际问题,但我只是想说明我经常使用这个结构.我认为它通常是同时测试两个布尔条件的最可读方式:

Dim A As Boolean
Dim B As Boolean
'
'do stuff to set values of A and B
'
Select Case True
  Case A And B
    'something
  Case A And Not B
    'something else
  Case Not A And B
    'you get the picture
  Case Else
    '...
End Select
Run Code Online (Sandbox Code Playgroud)

我承认,为什么我发现它易于阅读的部分原因是我确实使用它,并且我确实记得在我第一次看到它时必须解析它 - 但是一旦成功解析,我的反应是"那太棒了!"


Oor*_*ang 9

关于这个主题存在很多困惑,但要回答OP问题:是的,VB.Net中的逻辑评估与VB6中的逻辑评估相同,就像在VBA中一样.http://support.microsoft.com/kb/817250

要利用Select Case优化技术,您可以使用Select Cases固有语法来避免使用逻辑运算符和Or,Xor等.这些运算符确实具有短路评估功能.

考虑这个例子:

Public Sub Example()
    If A Or B Then
        Beep
    End If
    Select Case True
        Case A, B
            Beep
    End Select
End Sub

Private Function A() As Boolean
Debug.Print "A Ran"
    A = True
End Function

Private Function B() As Boolean
Debug.Print "B Ran"
    B = False
End Function
Run Code Online (Sandbox Code Playgroud)

Select Case版本只运行A. If-Block将同时运行.这不是If语句的错,而是And运算符的错误.如果您愿意,可以将If语句结构化为短路,如下所示:

Public Sub Example2()
    If A Then
    ElseIf B Then
        Beep
    End If
End Sub
Run Code Online (Sandbox Code Playgroud)

B不会跑.这只是一种风格问题.

重要的是要知道你要避免的是And/Or/Xor运算符而不是If-Blocks.如果您喜欢If-Block的Select Case版本更好...更多功能给你:)

  • 请注意,您可以使用OrElse进行短路并仅运行A. (3认同)