Select...Case 语句 (Visual Basic)

根据表达式的值运行若干组语句中的一组语句。

语法

Select [ Case ] testexpression  
    [ Case expressionlist  
        [ statements ] ]  
    [ Case Else  
        [ elsestatements ] ]  
End Select  

组成部分

术语 定义
testexpression 必需。 表达式。 计算结果必须为基本数据类型(BooleanByteCharDateDoubleDecimalIntegerLongObjectSByteShortSingleStringUIntegerULongUShort)之一。
expressionlist Case 语句中是必需的。 表示 testexpression 的匹配值的表达式子句列表。 多个表达式子句用逗号分隔。 各子句可以采用以下形式之一:

- expression1Toexpression2
- [ Is ] comparisonoperatorexpression
- -

使用 To 关键字为 testexpression 指定匹配值范围的边界。 expression1 的值必须小于或等于 expression2 的值。

Is 关键字与比较运算符(=<><<=>>=)结合使用,可指定对 testexpression 的匹配值的限制。 如果未提供 Is 关键字,它会自动插入到 comparisonoperator 之前。

仅指定 expression 的形式被视为 Is 形式的特殊情况,其中 comparisonoperator 为等号 (=)。 此形式的计算方式为 testexpression = expression

expressionlist 中的表达式可以是任何数据类型,前提是它们可以隐式转换为 testexpression 的类型,并且相应的 comparisonoperator 对于与之一起使用的两种类型都有效。
statements 可选。 Case 后面的一个或多个语句,在 testexpressionexpressionlist 中的任何子句匹配时运行。
elsestatements 可选。 Case Else 后面的一个或多个语句,在 testexpression 与任何 Case 语句的 expressionlist 中的任何子句都不匹配时运行。
End Select 终止 Select...Case 构造的定义。

注解

如果 testexpression 与任何 Caseexpressionlist 子句匹配,该 Case 语句后面的语句将运行到下一个 CaseCase ElseEnd Select 语句。 然后,控制权传递给 End Select 后面的语句。 如果 testexpression 与多个 Case 子句中的 expressionlist 子句匹配,则仅运行第一个匹配项后面的语句。

如果在 testexpression 和任何其他 Case 语句中的 expressionlist 子句之间找不到匹配项,则使用 Case Else 语句引入要运行的 elsestatements。 尽管不是必需的,但最好在 Select Case 构造中使用 Case Else 语句来处理不可预见的 testexpression 值。 如果 Caseexpressionlist 子句与 testexpression 不匹配,并且没有 Case Else 语句,则控制权传递给 End Select 后面的语句。

可以在每个 Case 子句中使用多个表达式或范围。 例如,以下行是有效的。

Case 1 To 4, 7 To 9, 11, 13, Is > maxNumber

注意

CaseCase Else 语句中使用的 Is 关键字与用于对象引用比较的 Is 运算符不同。

可以为字符串指定范围和多个表达式。 在以下示例中,Case 匹配符合以下条件的字符串:与“apples”完全相等,其值介于“nuts”和“soup”之间(按字母顺序),或包含与 testItem 的当前值完全相同的值。

Case "apples", "nuts" To "soup", testItem

Option Compare 的设置会影响字符串比较。 在 Option Compare Text 下,字符串“Apples”和“apples”比较为相等,但在 Option Compare Binary 下,它们不相等。

注意

包含多个子句的 Case 语句可能会表现出称为短路的行为。 Visual Basic 从左到右计算子句,如果一个子句与 testexpression 匹配,则不计算其余子句。 短路可以提高性能,但如果希望计算 expressionlist 中的每个表达式,它可能会产生意想不到的结果。 有关短路的详细信息,请参阅布尔表达式

如果 CaseCase Else 语句块中的代码不再需要运行块中的任何语句,则可以使用 Exit Select 语句退出该块。 这会立即将控制权传递给 End Select 后面的语句。

Select Case 构造可以嵌套。 每个嵌套的 Select Case 构造必须具有匹配的 End Select 语句,并且必须完全包含在嵌套它的外部 Select Case 构造的单个 CaseCase Else 语句块中。

示例

以下示例使用 Select Case 构造来编写与变量 number 的值相对应的行。 第二个 Case 语句包含与 number 的当前值匹配的值,因此将运行编写“Between 6 and 8, inclusive”的语句。

Dim number As Integer = 8
Select Case number
    Case 1 To 5
        Debug.WriteLine("Between 1 and 5, inclusive")
        ' The following is the only Case clause that evaluates to True.
    Case 6, 7, 8
        Debug.WriteLine("Between 6 and 8, inclusive")
    Case 9 To 10
        Debug.WriteLine("Equal to 9 or 10")
    Case Else
        Debug.WriteLine("Not between 1 and 10, inclusive")
End Select

另请参阅