本课学习目标
- 理解 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
适合不同类型条件
例如同时检查年龄、会员状态、余额、日期等不同表达式。
适合同一表达式的多个可能结果
例如同一个成绩、课程代码、月份、菜单选项或状态值。
8.2 Select Case 的基本结构
Select Case expression
Case value1
' value1 时执行
Case value2
' value2 时执行
Case Else
' 没有任何 Case 匹配时执行
End Select
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,都会执行同一段代码。
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
这种写法对于成绩、年龄区间、价格区间和数量范围都很实用。
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。
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
8.9 Select Case 还是 If...ElseIf?
| 场景 | 建议 | 原因 |
|---|---|---|
| 同一个成绩分成 A、B、C、D、F | Select Case | 围绕同一个 score,范围清楚。 |
| 同一个课程代码对应课程名称 | Select Case | 多个固定值非常适合 Case。 |
| 年龄 ≥ 18 并且有票 | If | 需要组合不同条件。 |
| 会员或有优惠券即可折扣 | If | 主要是 Boolean 逻辑组合。 |
| 月份 1–12 对应季度 | Select Case | 同一个 month 有多组可能值。 |
8.10 实作:课程等级与学费折扣判定器
建立新的 Windows Forms 项目:
CourseFeeAdvisor2026
用户输入学生姓名和课程学费,再从 ComboBox 选择会员等级。程序会使用 Select Case 决定折扣率,并计算折扣金额和最终学费。
会员等级:金卡会员
折扣率:10%
折扣金额:120.00
最终学费:1080.00
在 Form1 中加入:
| 控件 | Name | Text / 设置 |
|---|---|---|
| Form | Form1 | Text = 课程学费折扣判定器 |
| TextBox | txtStudentName | 输入学生姓名 |
| TextBox | txtCourseFee | 输入课程学费 |
| ComboBox | cmbMembership | 普通会员、银卡会员、金卡会员、白金会员 |
| Button | btnCalculate | Text = 计算学费 |
| Button | btnClear | Text = 清除 |
| Label | lblResult | 显示计算结果;建议 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
8.11 逐步理解程序逻辑
程序从 cmbMembership.Text 取得同一个 membership 表达式。
每个 Case 代表一种会员等级,并设置对应折扣率与说明。
没有匹配时使用 0% 折扣,并显示未选择有效等级。
折扣金额 = 学费 × 折扣率;最终学费 = 学费 − 折扣金额。
把学生、会员等级、折扣率、金额与说明组合到 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 初学者常见错误
忘记 End Select
Select Case 必须以 End Select 结束,不是 End If。
Case 文字与 ComboBox 不一致
如果界面项目是“金卡会员”,Case 也应使用完全对应的文字。
范围互相重叠
如果多个 Case 范围重叠,会让逻辑难以理解。应尽量设计互不冲突的范围。
所有问题都硬用 Select Case
如果条件涉及多个不同变量或复杂 Boolean 组合,If 通常更自然。
8.14 小练习
- 新增“学生会员”,折扣率设为 8%。
- 新增 ComboBox:cmbCourseLevel,项目为“初级、中级、高级”。使用另一个 Select Case 显示课程等级说明。
- 把会员等级分成两组:普通会员无折扣;银卡与学生会员享有一般优惠;金卡与白金会员享有高级优惠。练习在一个 Case 中列出多个值。
- 新增一个整数输入,使用 Case 1 To 3、Case 4 To 6 等范围显示课程阶段。
- 把第 7 课的成绩等级 If...ElseIf 改写成 Select Case,并比较哪一个版本更容易阅读。
本课复习
- Select Case 最适合处理哪一类多分支问题?
- Case Else 的作用是什么?
- 怎样让一个 Case 同时匹配多个离散值?
- Case 70 To 79 表示什么?
- Case Is >= 80 的作用是什么?
- Select Case 为什么要以 End Select 结束?
- 什么时候 If...ElseIf 会比 Select Case 更合适?
- 本课实作中,membership 为什么特别适合作为 Select Case 的表达式?