VB编程教程:从变量、判断语句到循环的基础入门

站长资讯21分钟前发布 jdkjadmin
0 00
VB编程教程:从变量、判断语句到循环的基础入门

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 程序的统一安全数值。

九、入门练习与下一步

掌握基础后,可以尝试改写综合示例:让用户选择录入整数还是小数;统计最高分和最低分;允许输入特定命令退出;或将成绩划分为多个等级。每次改动都可以检查三个问题:输入是否经过解析、边界值是否正确处理、循环是否能在预期条件下结束。

变量、判断和循环不仅是初学语法,也是后续学习数组、方法、类和异常处理的基础。先把类型选对、条件写清楚、循环出口设计完整,再扩展程序功能,会比依赖隐式转换和临时补丁更可靠。

© 版权声明

相关文章