VB Visual Basic 2026 中文教程
第 8 课 · 多分支判断

Select Case 多分支判断

当程序要针对同一个值检查很多可能情况时,连续写很多 ElseIf 会越来越长。Visual Basic 的 Select Case 可以把这种多分支逻辑写得更整齐、更容易阅读。本课将从最基本的 Case 开始,逐步学习单一值、多个值、范围、比较条件与 Case Else。

适合:完成第 7 课的初学者建议时间:45–60 分钟实作:课程等级与学费折扣判定器

本课学习目标

  • 理解 Select Case 的基本用途和执行方式。
  • 使用单一 Case 值进行判断。
  • 在一个 Case 中列出多个可能值。
  • 使用 To 判断数值范围。
  • 使用 Case Is >= 等比较方式。
  • 使用 Case Else 处理未匹配的情况。
  • 比较 Select Case 与 If...ElseIf 的适用场景。
  • 完成一个根据课程等级计算学费折扣的 Windows Forms 应用。

8.1 为什么需要 Select Case?

如果多个判断都围绕同一个表达式,Select Case 往往比很多个 ElseIf 更清楚。

例如,要根据课程代码显示课程名称:

If courseCode = "VB" Then
    courseName = "Visual Basic 2026"
ElseIf courseCode = "CS" Then
    courseName = "C# Programming"
ElseIf courseCode = "PY" Then
    courseName = "Python Programming"
Else
    courseName = "未知课程"
End If

使用 Select Case 可以写成:

Select Case courseCode
    Case "VB"
        courseName = "Visual Basic 2026"
    Case "CS"
        courseName = "C# Programming"
    Case "PY"
        courseName = "Python Programming"
    Case Else
        courseName = "未知课程"
End Select
If...ElseIf

适合不同类型条件

例如同时检查年龄、会员状态、余额、日期等不同表达式。

Select Case

适合同一表达式的多个可能结果

例如同一个成绩、课程代码、月份、菜单选项或状态值。

8.2 Select Case 的基本结构

Select Case expression

    Case value1
        ' value1 时执行

    Case value2
        ' value2 时执行

    Case Else
        ' 没有任何 Case 匹配时执行

End Select
Select Case expression先计算一次要判断的表达式。
Case ...从上往下寻找与该表达式匹配的 Case。
Case Else所有前面的 Case 都不匹配时执行,可视为“其他情况”。
End Select结束整个 Select Case 结构。
别写成 End If Select Case 必须以 End Select 结束。End If 只用于多行 If 结构。

8.3 使用单一值

最基本的写法是一个 Case 对应一个值:

Dim dayNumber As Integer = 3
Dim dayName As String

Select Case dayNumber
    Case 1
        dayName = "星期一"
    Case 2
        dayName = "星期二"
    Case 3
        dayName = "星期三"
    Case 4
        dayName = "星期四"
    Case 5
        dayName = "星期五"
    Case 6
        dayName = "星期六"
    Case 7
        dayName = "星期日"
    Case Else
        dayName = "无效的星期编号"
End Select

由于 dayNumber 是 3,程序匹配 Case 3,所以 dayName 变成“星期三”。

8.4 一个 Case 处理多个值

多个离散值可以写在同一个 Case 中,并用逗号分隔:

Select Case dayNumber
    Case 1, 2, 3, 4, 5
        lblResult.Text = "工作日"

    Case 6, 7
        lblResult.Text = "周末"

    Case Else
        lblResult.Text = "无效编号"
End Select

如果 dayNumber 是 1、2、3、4 或 5,都会执行同一段代码。

适合“多个值得到同一个结果” 与其重复写五个完全相同的 Case,不如把相关值放到一个 Case 中,可读性更好。

8.5 使用 To 判断范围

数值判断常常需要处理一段连续范围。Select Case 可以用 To 表示范围:

Dim score As Integer = 76
Dim grade As String

Select Case score
    Case 80 To 100
        grade = "A"
    Case 70 To 79
        grade = "B"
    Case 60 To 69
        grade = "C"
    Case 50 To 59
        grade = "D"
    Case 0 To 49
        grade = "F"
    Case Else
        grade = "无效成绩"
End Select
80–100A
70–79B
60–69C
50–59D

这种写法对于成绩、年龄区间、价格区间和数量范围都很实用。

8.6 使用 Case Is 比较

除了固定范围,也可以使用 Case Is 加比较运算符:

Select Case score
    Case Is >= 80
        grade = "A"
    Case Is >= 70
        grade = "B"
    Case Is >= 60
        grade = "C"
    Case Is >= 50
        grade = "D"
    Case Else
        grade = "F"
End Select

这和第 7 课“从高分往低分判断”的逻辑类似。因为 Select Case 也是从上往下匹配,一旦找到符合的 Case,就不会继续执行后面的 Case。

范围写法与 Case Is 都可以使用 Case 80 To 100 直接表达一个封闭范围;Case Is >= 80 更像条件门槛。选择更容易表达业务规则的方式即可。

8.7 Case Else:处理其他情况

Case Else 类似 If 结构中的 Else。当没有任何前面的 Case 匹配时执行:

Select Case courseCode
    Case "VB"
        lblResult.Text = "Visual Basic 2026"
    Case "CS"
        lblResult.Text = "C# Programming"
    Case Else
        lblResult.Text = "找不到该课程"
End Select

虽然不是每个 Select Case 都必须写 Case Else,但对于用户输入或外部数据,加入它通常能让程序更完整。

8.8 Select Case 也可以判断字符串

Select Case 不只适用于数字,也经常用来判断字符串:

Dim membership As String = cmbMembership.Text

Select Case membership
    Case "普通会员"
        discountRate = 0D
    Case "银卡会员"
        discountRate = 0.05D
    Case "金卡会员"
        discountRate = 0.1D
    Case "白金会员"
        discountRate = 0.15D
    Case Else
        discountRate = 0D
End Select
文字必须能匹配预期值 如果 ComboBox 中的项目写成“金卡”,代码却检查“金卡会员”,就不会匹配。界面文字与代码中的 Case 值应保持一致。

8.9 Select Case 还是 If...ElseIf?

场景建议原因
同一个成绩分成 A、B、C、D、FSelect Case围绕同一个 score,范围清楚。
同一个课程代码对应课程名称Select Case多个固定值非常适合 Case。
年龄 ≥ 18 并且有票If需要组合不同条件。
会员或有优惠券即可折扣If主要是 Boolean 逻辑组合。
月份 1–12 对应季度Select Case同一个 month 有多组可能值。
不要强迫所有判断都使用同一种语法 好代码的目标是清楚表达逻辑。If 和 Select Case 都很重要,应根据问题选择最清楚的结构。

8.10 实作:课程等级与学费折扣判定器

建立新的 Windows Forms 项目:

CourseFeeAdvisor2026

用户输入学生姓名和课程学费,再从 ComboBox 选择会员等级。程序会使用 Select Case 决定折扣率,并计算折扣金额和最终学费。

Course Fee Advisor 2026
学生姓名:
陈美玲
课程学费:
1200
会员等级:
金卡会员 ▾
操作:
计算学费
学生:陈美玲
会员等级:金卡会员
折扣率:10%
折扣金额:120.00
最终学费:1080.00

在 Form1 中加入:

控件NameText / 设置
FormForm1Text = 课程学费折扣判定器
TextBoxtxtStudentName输入学生姓名
TextBoxtxtCourseFee输入课程学费
ComboBoxcmbMembership普通会员、银卡会员、金卡会员、白金会员
ButtonbtnCalculateText = 计算学费
ButtonbtnClearText = 清除
LabellblResult显示计算结果;建议 AutoSize = True

完整的 btnCalculate_Click 代码

Private Sub btnCalculate_Click(sender As Object, e As EventArgs) _
    Handles btnCalculate.Click

    Dim studentName As String = txtStudentName.Text.Trim()
    Dim courseFee As Decimal = CDec(txtCourseFee.Text)
    Dim membership As String = cmbMembership.Text

    Dim discountRate As Decimal
    Dim membershipNote As String

    Select Case membership
        Case "普通会员"
            discountRate = 0D
            membershipNote = "标准学费"

        Case "银卡会员"
            discountRate = 0.05D
            membershipNote = "享有 5% 折扣"

        Case "金卡会员"
            discountRate = 0.1D
            membershipNote = "享有 10% 折扣"

        Case "白金会员"
            discountRate = 0.15D
            membershipNote = "享有 15% 折扣"

        Case Else
            discountRate = 0D
            membershipNote = "未选择有效会员等级"
    End Select

    Dim discountAmount As Decimal = courseFee * discountRate
    Dim finalFee As Decimal = courseFee - discountAmount

    lblResult.Text =
        "学生:" & studentName & Environment.NewLine &
        "会员等级:" & membership & Environment.NewLine &
        "说明:" & membershipNote & Environment.NewLine &
        "折扣率:" & discountRate.ToString("P0") & Environment.NewLine &
        "折扣金额:" & discountAmount.ToString("N2") & Environment.NewLine &
        "最终学费:" & finalFee.ToString("N2")

End Sub

清除按钮

Private Sub btnClear_Click(sender As Object, e As EventArgs) Handles btnClear.Click
    txtStudentName.Clear()
    txtCourseFee.Clear()
    cmbMembership.SelectedIndex = -1
    lblResult.Text = ""
    txtStudentName.Focus()
End Sub
ToString("P0") 的作用 如果 discountRate 是 0.1,ToString("P0") 会显示为 10%。完整格式化内容将在第 12 课进一步学习。

8.11 逐步理解程序逻辑

1
读取会员等级

程序从 cmbMembership.Text 取得同一个 membership 表达式。

2
Select Case 匹配等级

每个 Case 代表一种会员等级,并设置对应折扣率与说明。

3
Case Else 提供后备处理

没有匹配时使用 0% 折扣,并显示未选择有效等级。

4
使用表达式计算

折扣金额 = 学费 × 折扣率;最终学费 = 学费 − 折扣金额。

5
显示结果

把学生、会员等级、折扣率、金额与说明组合到 lblResult。

8.12 再练习:用范围判断课程等级

假设课程评分按 0–100 分显示等级,可以直接使用 Select Case 范围:

Dim score As Integer = 88
Dim level As String

Select Case score
    Case 90 To 100
        level = "卓越"
    Case 80 To 89
        level = "优秀"
    Case 70 To 79
        level = "良好"
    Case 60 To 69
        level = "合格"
    Case 0 To 59
        level = "需要加强"
    Case Else
        level = "无效分数"
End Select

这个例子说明 Select Case 既能处理字符串固定值,也能处理数字范围。

8.13 初学者常见错误

错误 1

忘记 End Select

Select Case 必须以 End Select 结束,不是 End If。

错误 2

Case 文字与 ComboBox 不一致

如果界面项目是“金卡会员”,Case 也应使用完全对应的文字。

错误 3

范围互相重叠

如果多个 Case 范围重叠,会让逻辑难以理解。应尽量设计互不冲突的范围。

错误 4

所有问题都硬用 Select Case

如果条件涉及多个不同变量或复杂 Boolean 组合,If 通常更自然。

8.14 小练习

  1. 新增“学生会员”,折扣率设为 8%。
  2. 新增 ComboBox:cmbCourseLevel,项目为“初级、中级、高级”。使用另一个 Select Case 显示课程等级说明。
  3. 把会员等级分成两组:普通会员无折扣;银卡与学生会员享有一般优惠;金卡与白金会员享有高级优惠。练习在一个 Case 中列出多个值。
  4. 新增一个整数输入,使用 Case 1 To 3Case 4 To 6 等范围显示课程阶段。
  5. 把第 7 课的成绩等级 If...ElseIf 改写成 Select Case,并比较哪一个版本更容易阅读。

本课复习

  1. Select Case 最适合处理哪一类多分支问题?
  2. Case Else 的作用是什么?
  3. 怎样让一个 Case 同时匹配多个离散值?
  4. Case 70 To 79 表示什么?
  5. Case Is >= 80 的作用是什么?
  6. Select Case 为什么要以 End Select 结束?
  7. 什么时候 If...ElseIf 会比 Select Case 更合适?
  8. 本课实作中,membership 为什么特别适合作为 Select Case 的表达式?