
VB编程教程:从变量、判断语句到循环的基础入门
VB(Visual Basic)是一种语法较易读的编程语言,常用于 Windows 应用、办公自动化和既有 .NET 项目的维护。学习 VB 时,变量、判断语句和循环是最先要掌握的基础:变量保存数据,判断决定程序走哪条路径,循环则用于重复执行操作。
本文以 VB.NET 为例,代码可用于 .NET 控制台项目。VB.NET 与早期的 Visual Basic 6.0 并非同一套运行平台,虽然部分语法相似,但类型系统、库和项目结构不同。新建 VB.NET 控制台项目后,可将示例中的代码放入项目的 Module 中运行。若使用较旧的 Visual Studio 或 .NET 版本,个别项目配置可能不同。
一、先搭好程序框架
VB.NET 控制台程序通常从 Sub Main 开始执行。下面是一个完整的最小示例:
Option Explicit On
Option Strict On
Module Program
Sub Main()
Console.WriteLine("你好,VB.NET")
End Sub
End Module
Option Explicit On 要求变量先声明再使用,避免拼写错误意外变成另一个变量。Option Strict On 会限制某些可能造成数据丢失的隐式类型转换。新项目中建议开启这两个选项;也可以在项目属性中统一设置。
VB 语句通常以换行分隔,不要求每行末尾添加分号。关键字不区分大小写,例如 Console 和 console 在语言语法上等价,但统一命名风格更易读。单引号用于注释,注释从单引号开始延续到该行末尾。
二、变量与数据类型
变量是带有名称和类型的存储位置。声明时使用 Dim,并用 As 指定类型:
Dim userName As String
Dim age As Integer
Dim price As Decimal
Dim isActive As Boolean
userName = "Lin"
age = 28
price = 19.95D
isActive = True
声明时也可以直接赋初值:
Dim userName As String = "Lin"
Dim count As Integer = 0
Dim taxRate As Double = 0.08
选择类型时要考虑数据用途,不要只图省事地把所有数字都存成同一种类型。
Integer是 32 位有符号整数,适合常见计数和数组下标。其范围为 -2,147,483,648 到 2,147,483,647。Long是 64 位有符号整数,适用于可能超出Integer范围的整数。Decimal适合需要较高十进制精度的金额计算。它的范围和精度有限,并非所有实数都能精确表示。Double是二进制浮点类型,适合科学计算等场景。许多十进制小数无法被它精确表示,不宜直接用来要求精确十进制结果的金额计算。String保存文本,Boolean保存True或False。Date表示日期和时间。它本身不包含时区信息,处理跨时区时间时需要明确约定并适当转换。
在整数运算中,超出类型范围可能导致溢出。是否在运行时检查溢出,可能受项目编译设置和具体运算影响,因此不能依赖“溢出一定会自动报错”。对外部数据计算时,选择合适类型并在必要时进行范围检查;需要检查溢出的场景可使用 Checked 上下文:
Dim a As Integer = 100000
Dim b As Integer = 30000
Try
Dim result As Integer = Checked(a * b)
Console.WriteLine(result)
Catch ex As OverflowException
Console.WriteLine("计算结果超出 Integer 范围")
End Try
局部变量在使用前应明确赋值。声明而未赋值的局部变量通常不能直接读取;而类的字段会有默认值,例如数值字段默认为零、布尔字段默认为 False、引用类型字段默认为 Nothing。不要把字段的默认值规则误用到局部变量上。
Nothing 在 VB.NET 中可表示引用为空,也可表示值类型的默认值。若需要表达“有值”或“没有值”,可以考虑可空值类型,例如 Integer?。比较可能为空的引用时,应先检查是否为 Nothing,不要假设它一定指向对象。
三、输入、类型转换与输出
控制台输入通过 Console.ReadLine 获得,返回值是字符串;即使用户输入了数字,也必须先转换才能进行数值计算。直接强制转换不适合处理不可信或可能输错的输入,宜使用 TryParse,这样格式错误时不会因为转换异常而中断程序。
Module Program
Sub Main()
Console.Write("请输入年龄:")
Dim input As String = Console.ReadLine()
Dim age As Integer
If Integer.TryParse(input, age) Then
If age >= 0 AndAlso age <= 130 Then
Console.WriteLine("输入的年龄是 " & age)
Else
Console.WriteLine("年龄超出本例接受的范围")
End If
Else
Console.WriteLine("请输入有效的整数")
End If
End Sub
End Module
上例中的 0 到 130 是示范程序自行设定的输入规则,并不是 Integer 或 TryParse 的内置限制。数据解析成功,只代表输入符合目标类型的格式和范围,并不意味着它符合业务规则。业务允许的年龄范围、数量上限等,要由程序另行定义。
数字解析还可能受区域设置影响,例如小数点符号在不同文化设置下可能不同。若程序要读写固定格式的数据文件或网络协议,应明确指定区域性,而不是依赖运行机器的系统设置。下面展示如何按固定的英文区域格式解析小数:
Imports System.Globalization
Module Program
Sub Main()
Dim input As String = "12.50"
Dim amount As Decimal
Dim parsed As Boolean =
Decimal.TryParse(
input,
NumberStyles.Number,
CultureInfo.InvariantCulture,
amount)
If parsed Then
Console.WriteLine(amount)
Else
Console.WriteLine("小数格式无效")
End If
End Sub
End Module
这个示例使用了 Imports System.Globalization,实际项目中应将它放在模块代码之前。对普通本地交互界面,按用户的区域设置读取数字可能更符合预期;对协议和固定格式数据,则应采用约定好的格式。
输出时可以使用字符串拼接,也可以使用插值字符串(较新的 VB.NET 项目支持):
Dim name As String = "Mina"
Dim score As Integer = 92
Console.WriteLine("姓名:" & name & ",分数:" & score)
Console.WriteLine($"姓名:{name},分数:{score}")
拼接时的 & 用于连接字符串。虽然在某些情形下 + 也能参与字符串操作,但它也用于数值相加,混合类型时容易造成歧义,字符串拼接优先使用 & 更清晰。
四、条件判断:If、ElseIf 与 Else
If...Then 根据布尔条件决定是否执行一段代码。条件成立时执行 Then 后面的代码,不成立时可以使用 Else:
Dim score As Integer = 76
If score >= 60 Then
Console.WriteLine("通过")
Else
Console.WriteLine("未通过")
End If
有多个互斥区间时,可以使用 ElseIf。条件按书写顺序检查,满足第一项后就执行对应分支,其余分支不再检查:
Dim score As Integer = 85
Dim grade As String
If score < 0 OrElse score > 100 Then
grade = "分数无效"
ElseIf score >= 90 Then
grade = "优秀"
ElseIf score >= 80 Then
grade = "良好"
ElseIf score >= 60 Then
grade = "及格"
Else
grade = "不及格"
End If
Console.WriteLine(grade)
这里先排除小于 0 或大于 100 的值,再判断等级,可避免把超出范围的分数误判为正常等级。边界判断应特别留意使用 > 还是 >=:例如“达到 60 分通过”对应 score >= 60,不是 score > 60。
VB.NET 的 AndAlso 和 OrElse 支持短路求值。使用 AndAlso 时,如果左侧已经为 False,右侧不会执行;使用 OrElse 时,如果左侧已经为 True,右侧不会执行。它们适合写依赖前置检查的条件:
Dim text As String = Nothing
If text IsNot Nothing AndAlso text.Length > 0 Then
Console.WriteLine(text)
Else
Console.WriteLine("文本为空")
End If
若改用会检查两侧的逻辑运算符,就不能依赖左侧条件阻止右侧访问空对象。初学者在组合多个条件时,通常应优先考虑 AndAlso 与 OrElse,并用括号表达复杂逻辑,减少优先级理解错误。
多个固定值分支也可以使用 Select Case,例如菜单选项或状态码:
Dim command As Integer = 2
Select Case command
Case 1
Console.WriteLine("新建")
Case 2
Console.WriteLine("打开")
Case 3
Console.WriteLine("退出")
Case Else
Console.WriteLine("未知选项")
End Select
对于范围,Case 也可以写成区间形式,例如 Case 60 To 100。注意 VB.NET 中该区间包含两端。若多个分支的区间重叠,代码读起来会变得不清楚,应尽量设计互不重叠的条件。
五、循环:重复执行与正确退出
1. For:重复固定次数
已知循环次数或需要遍历一段整数区间时,使用 For...Next:
For i As Integer = 1 To 5
Console.WriteLine(i)
Next
在 VB.NET 中,To 后面的终点默认也会执行,所以本例输出 1 到 5。需要按指定步长变化时使用 Step:
For i As Integer = 10 To 2 Step -2
Console.WriteLine(i)
Next
循环变量通常由循环语句控制,不要在循环体内再随意修改它,否则容易跳过元素或形成难以预期的行为。起点、终点和步长也要保持方向一致:起点大于终点却使用正步长时,循环体通常不会执行。若终点可能接近整数类型上限,还要避免循环递增时发生溢出。
2. For Each:遍历集合
遍历数组或集合中的每一项时,For Each 往往比手动使用下标更直观:
Dim colors As String() = {"红", "绿", "蓝"}
For Each color As String In colors
Console.WriteLine(color)
Next
For Each 能减少下标越界的机会,但循环中不应假定集合可以安全地同时被其他代码修改。遍历期间修改集合结构,可能导致异常或不符合预期;需要增删元素时,可以先记录待处理项,结束遍历后再修改,或使用适合该操作的遍历方式。
3. While:条件成立时持续执行
循环次数未知、要等到某个条件满足才停止时,可以用 While...End While。必须确保循环条件最终有机会变为 False,否则就会形成无限循环:
Dim number As Integer = 1
While number <= 5
Console.WriteLine(number)
number += 1
End While
如果漏写 number += 1,条件始终成立,程序就无法正常结束。对于根据用户输入决定是否继续的循环,也要处理输入错误和退出命令。
4. Do While 与 Do Until
Do While 在每次执行前判断条件,条件不成立时可能一次也不执行。Do Until 则在条件成立时结束循环,适合直接表达“重复直到某条件达成”:
Dim count As Integer = 0
Do While count < 3
Console.WriteLine("执行 " & count)
count += 1
Loop
若希望循环体至少执行一次,可使用把条件判断放在结尾的形式:
Dim answer As String
Do
Console.Write("请输入 yes 继续,其他内容退出:")
answer = Console.ReadLine()
Loop While answer = "yes"
Console.WriteLine("循环结束")
上例的比较是精确的字符串比较,用户输入 Yes 或带空格的内容不会匹配 yes。实际程序若希望忽略大小写或前后空格,应显式使用 Trim 和适当的字符串比较规则,不要假设输入会自动规范化。
5. Exit 与 Continue
在确实需要提前结束循环时,可以使用 Exit For、Exit While 或相应的 Exit Do。Continue For、Continue While 和 Continue Do 用于跳过当前轮剩余部分,进入下一轮。它们能简化某些逻辑,但过度使用会让程序的执行路径难以追踪。
For i As Integer = 1 To 10
If i = 4 Then
Continue For
End If
If i = 8 Then
Exit For
End If
Console.WriteLine(i)
Next
这个示例跳过 4,在遇到 8 时结束循环。注意 Continue For 会直接开始下一轮,不会继续执行它后面的判断和输出代码。
六、综合示例:验证输入并计算总分
下面的完整程序读取若干个整数分数,遇到输入格式错误或分数不在 0 到 100 之间时提示用户重试,最后计算平均分。它展示了变量、判断、输入转换和循环的配合:
Option Explicit On
Option Strict On
Module Program
Sub Main()
Dim count As Integer
Console.Write("请输入要录入的分数数量:")
Dim countInput As String = Console.ReadLine()
If Not Integer.TryParse(countInput, count) Then
Console.WriteLine("数量必须是整数")
Return
End If
If count <= 0 OrElse count > 1000 Then
Console.WriteLine("数量必须在 1 到 1000 之间")
Return
End If
Dim total As Long = 0
For i As Integer = 1 To count
Dim score As Integer
Dim valid As Boolean = False
While Not valid
Console.Write("请输入第 " & i & " 个分数:")
Dim input As String = Console.ReadLine()
If Integer.TryParse(input, score) Then
If score >= 0 AndAlso score <= 100 Then
valid = True
Else
Console.WriteLine("分数必须在 0 到 100 之间")
End If
Else
Console.WriteLine("请输入整数")
End If
End While
total += score
Next
Dim average As Double = CDbl(total) / count
Console.WriteLine("总分:" & total)
Console.WriteLine("平均分:" & average)
End Sub
End Module
数量上限 1000 是这个示例为控制工作量而自行设置的规则,不是 VB.NET 的通用参数限制。真实程序应依据需求、资源和数据来源确定合理上限。总分使用 Long,避免在数量增加时轻易超出 Integer 范围;计算平均值时将总分转换为 Double,避免整数除法只保留整数部分。
这里的 Return 用于提前结束 Sub Main。输入值通过 TryParse 解析后,程序仍会检查业务范围;两步缺一不可。若输入来自命令行、文件或网络,实际程序还应对输入长度、格式和数量进行合理限制,并考虑错误记录和取消操作。
七、常见错误与边界检查
- 把输入字符串当数字计算:
Console.ReadLine返回字符串。应使用TryParse解析,并区分格式错误和业务范围错误。 - 混淆闭区间与开区间:
For i = 1 To 5会包含 5。数组下标则通常从 0 开始,遍历时应使用数组长度或For Each,不要把元素数量误当成最大下标。 - 循环条件没有更新:检查循环体是否改变条件所依赖的变量,并确认错误输入不会让循环永远无法退出。
- 使用错误的数值类型:整数可能溢出,二进制浮点数可能有精度误差。根据数量范围和计算用途选择类型,不能仅依赖最终输出看起来正确。
- 把能解析当成有效:一个整数可以成功转换,却不符合订单数量、年龄或分数的业务范围。解析和业务校验是两项不同工作。
- 忽略空值和空字符串:
Nothing与空字符串""不等价。需要区分“没有对象”和“有一个长度为零的文本”。 - 条件太复杂或顺序不当:用括号明确组合关系,先处理非法范围,再处理普通分支,并检查边界值本身属于哪一类。
- 循环中随意修改集合:遍历时增删集合元素可能造成异常或遗漏。先确定需要修改的元素,再选择合适的操作流程。
八、输入验证与安全用途的边界
输入校验可以减少格式错误、非法状态和资源浪费,但不能单独构成完整的安全措施。客户端或控制台程序中的限制可以被绕过;如果关键规则决定权限、资金或数据完整性,必须在可信的服务端或数据处理边界再次验证。
例如,限制用户输入为正整数,并不能防止 SQL 注入。把输入直接拼进 SQL 字符串仍然有风险,应使用数据库驱动提供的参数化查询,并让参数具有合适的数据类型。类似地,网页输出需要按具体输出环境进行编码;文件路径、命令行参数和网络协议也有各自的安全处理要求,不能用一条通用的字符串过滤规则代替。
外部输入还可能很长,或要求程序执行大量循环。除验证数据格式外,应根据业务需要设置长度、数量、超时或工作量限制,并在计算可能超出类型范围时采取明确处理策略。具体限制应来自应用需求和运行环境,不存在适用于所有 VB 程序的统一安全数值。
九、入门练习与下一步
掌握基础后,可以尝试改写综合示例:让用户选择录入整数还是小数;统计最高分和最低分;允许输入特定命令退出;或将成绩划分为多个等级。每次改动都可以检查三个问题:输入是否经过解析、边界值是否正确处理、循环是否能在预期条件下结束。
变量、判断和循环不仅是初学语法,也是后续学习数组、方法、类和异常处理的基础。先把类型选对、条件写清楚、循环出口设计完整,再扩展程序功能,会比依赖隐式转换和临时补丁更可靠。





