VB编程入门:从变量、数据类型到第一个程序

教程1天前发布 jdkjadmin
0 00
VB编程入门:从变量、数据类型到第一个程序

VB编程入门:从变量、数据类型到第一个程序

VB(Visual Basic)是一种语法较易阅读的编程语言。如今提到 VB 编程,通常指运行在 .NET 平台上的 Visual Basic(也常写作 VB.NET)。它既能编写控制台程序,也能用于 Windows 桌面应用和 .NET 项目中的业务逻辑。本文以现代 .NET 控制台应用为例,介绍如何准备环境、声明变量、处理输入,并完成一个可以运行的程序。

先说明一个重要边界:Visual Basic 6(VB6)和现代 Visual Basic 属于不同的开发环境与运行时体系。本文示例面向 .NET 版 Visual Basic,不适用于 VB6 工程。新项目通常应使用受支持的 .NET SDK;具体可用的 .NET 版本取决于所安装的 SDK、项目设置和组织的支持政策。

一、VB 适合做什么

Visual Basic 的语法强调可读性,适合学习变量、条件、循环、函数和面向对象等编程基础。已有 .NET 系统如果采用 VB 编写,也可以用它维护业务代码。它还可用于构建 .NET 控制台程序及部分 Windows 桌面应用。

选择语言时要结合项目生态。新项目若依赖某个库或团队标准,应先确认它是否支持 Visual Basic;许多 .NET 库可以从 VB 调用,但并非所有工具、代码生成器、示例和第三方框架都为 VB 提供同等支持。若目标是跨平台界面、大型新项目或招聘协作,还应一并评估 .NET 平台支持情况、团队经验和依赖兼容性。VB 不是 VBScript,也不是 Excel VBA;它们的宿主环境、对象模型和用途不同,代码不能默认互相通用。

二、准备开发环境并运行程序

安装 .NET SDK 后,可以使用命令行创建 VB 控制台项目。打开终端,执行:

dotnet new console -lang VB -o FirstVbApp
cd FirstVbApp
dotnet run

第一条命令创建名为 FirstVbApp 的项目,第二条进入项目目录,第三条编译并运行。SDK 会生成项目文件和源代码文件,通常主程序位于 Program.vb。若提示找不到 dotnet,应先安装 .NET SDK 并确认命令行可以找到它;仅安装运行时通常不足以创建和编译项目。

控制台程序适合练习输入、输出和逻辑,不需要先搭建图形界面。下面是一段完整的 VB 程序。它读取姓名并输出问候语,可替换项目中的主程序内容后运行:

Option Strict On
Option Explicit On

Module Program
    Sub Main()
        Console.Write("请输入姓名:")
        Dim name As String = Console.ReadLine()

        If String.IsNullOrWhiteSpace(name) Then
            Console.WriteLine("没有输入姓名。")
        Else
            Console.WriteLine($"你好,{name}!")
        End If
    End Sub
End Module

Module 用来组织一组程序成员,Sub Main 是控制台程序的入口点。Console.Write 输出提示但不换行,Console.WriteLine 输出后换行,Console.ReadLine 读取一行文本。插值字符串以 $" 开始,花括号中的表达式会被计算并放入字符串。

三、变量:给数据起名字

变量可以理解为程序中有名称、用于保存值的位置。VB 通常使用 Dim 声明变量:

Dim userName As String
Dim age As Integer
Dim price As Decimal

userName = "Lin"
age = 28
price = 19.95D

Console.WriteLine(userName)
Console.WriteLine(age)
Console.WriteLine(price)

As 后面写变量类型。声明时也可以同时赋初值:

Dim count As Integer = 3
Dim message As String = "准备开始"
Dim enabled As Boolean = True

VB 也支持根据初始值推断局部变量的类型:

Dim count = 3
Dim message = "准备开始"

在通常情况下,第一行会推断为 Integer,第二行会推断为 String。推断并不意味着变量以后可以随意改成另一种类型;类型在编译时已经确定。入门和团队代码中,关键变量显式写出类型更容易阅读,也便于发现意外的类型推断。注意,若要启用推断,变量必须能从初始化表达式确定类型;只声明而不初始化时,应明确写出类型。

VB 标识符不区分大小写,因此 userName 和 UserName 会被视为同一个名字。标识符应使用字母、数字和下划线,并以字母或下划线开头;不要使用难以理解的缩写,也避免与关键字冲突。变量名建议表达用途,例如 totalPrice 比 x 更容易维护。

四、数据类型与数值边界

类型决定了变量能表示的数据范围,以及可对它进行的运算。常见内置类型如下:

  • Boolean:逻辑值,取 True 或 False。
  • Byte:无符号 8 位整数,范围为 0 到 255。
  • Short:有符号 16 位整数,范围为 −32,768 到 32,767。
  • Integer:有符号 32 位整数,范围为 −2,147,483,648 到 2,147,483,647。
  • Long:有符号 64 位整数,适合更大范围的整数计数。
  • Single、Double:二进制浮点类型,适合近似数值计算。
  • Decimal:十进制数值类型,适合金额等需要十进制表示的场景。
  • Char:单个 UTF-16 代码单元;String:文本字符串。
  • Date:日期与时间值。

整数类型有明确范围,超出范围可能在转换或运算时产生溢出。选择类型时不要只看当前样例:累计数量、文件大小和时间戳可能远大于单次输入。需要整数除法时也要留意,整数相除可能得到整数结果;若业务需要小数,应先转换为合适的浮点或十进制类型。

Double 使用二进制浮点表示,许多十进制小数不能被精确表示。例如某些看似简单的小数运算会产生细微误差。科学计算和通常的测量数据常用浮点类型;涉及货币时,通常选用 Decimal,但仍需明确舍入规则、币种精度和输入范围。Decimal 的精度和范围也有限,并非无限精确;具体范围可查阅 .NET 的 System.Decimal 文档。不要为了“更精确”而把所有数字都改成 Decimal,应按计算需求选择类型。

字符串长度受 .NET 字符串表示、可用内存和运行时等因素约束,不应假设存在一个适用于所有程序的固定文本上限。对外部输入仍要设置符合业务的长度限制,以避免无意中处理过大的内容。若字符串可能为 Nothing(空引用),访问其成员前应检查;在现代 .NET 项目中是否启用可空引用类型检查,取决于项目配置。

五、常量、运算与表达式

不会在程序运行期间改变的值可以声明为常量:

Const TaxRate As Decimal = 0.08D
Dim subtotal As Decimal = 100D
Dim tax As Decimal = subtotal * TaxRate
Dim total As Decimal = subtotal + tax

Console.WriteLine($"税额:{tax}")
Console.WriteLine($"合计:{total}")

VB 中 +、-、*、/ 分别表示加、减、乘、除;\ 表示整数除法,Mod 求余数。比较运算常见的有 =、<>、<、>、<= 和 >=。逻辑判断可使用 AndAlso、OrElse 和 Not。

初学者常把 = 误以为只用于赋值。在 VB 中,它也用于比较相等;赋值语句和比较表达式由语法上下文区分。判断不相等使用 <>,不是常见于其他语言的 !=。可以用圆括号明确运算优先级,尤其当表达式混合算术、比较和逻辑运算时。

六、可靠读取数字:TryParse 与验证

用户输入本质上是文本。直接把输入当作数字使用,遇到空内容、字母或超出范围的数字时,就可能无法按预期转换。对于用户输入,常用 TryParse:转换成功时返回 True,结果写入输出参数;失败时返回 False,程序可以给出提示,而不是依赖异常处理日常输入错误。

Option Strict On
Option Explicit On

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 的可解析格式还会受类型和区域性规则影响;例如小数点、千位分隔符可能随当前区域设置而异。需要固定格式时,应使用 .NET 提供的带格式和区域性参数的解析重载,并明确约定输入格式。

示例中的 AndAlso 会在左侧条件为 False 时跳过右侧求值,适合编写需要短路求值的逻辑。它也能避免不必要的计算。不要把客户端校验或界面提示当作数据可信的证明:服务端、数据库入口或其他安全边界仍需按实际威胁模型验证输入。

七、条件、循环与方法

If 用来根据条件选择分支:

Dim score As Integer = 82

If score >= 90 Then
    Console.WriteLine("优秀")
ElseIf score >= 60 Then
    Console.WriteLine("合格")
Else
    Console.WriteLine("需要继续练习")
End If

For 适合次数明确的循环。VB 的 For 终值默认包含在循环范围内:

For i As Integer = 1 To 5
    Console.WriteLine(i)
Next

这段代码会输出 1 到 5。需要逐步变化时,可使用 Step;若循环边界可能被输入影响,应确认不会发生过多迭代或整数溢出。对“条件成立就继续”的情形,可使用 While,并确保循环中的状态会发生变化,否则程序可能无法结束。

可复用的逻辑适合放进方法(VB 中常称过程)。Function 返回一个值,Sub 不返回值:

Module Program
    Function Add(a As Integer, b As Integer) As Integer
        Return a + b
    End Function

    Sub Main()
        Dim result As Integer = Add(4, 6)
        Console.WriteLine(result)
    End Sub
End Module

把输入处理、计算和输出拆成清晰的方法,有助于测试和维护。方法参数应使用能表达实际需求的类型,必要时检查参数范围;输入校验不能替代对运算边界的检查。例如,两个合法的 Integer 相加,结果仍可能超出 Integer 范围。

八、数组、索引与边界

数组可保存多个同类型元素。VB 的数组索引默认从 0 开始:

Dim scores As Integer() = {80, 92, 75}

Console.WriteLine(scores(0))
Console.WriteLine(scores.Length)

For i As Integer = 0 To scores.Length - 1
    Console.WriteLine(scores(i))
Next

这个数组有 3 个元素,合法索引为 0、1、2。访问 scores(3) 会越界。遍历数组时要区分元素数量和最后一个索引:长度为 Length,最后一个有效索引通常是 Length - 1。对于可能为空的数组,应在访问前处理长度为 0 的情况;否则循环边界的计算也可能出现问题。

VB 还支持多维数组,使用多个索引访问。数组大小通常在创建时确定;若需要动态增删集合元素,可根据需求考虑 .NET 集合类型,例如 List(Of T)。数组是否从 0 开始由其下界决定,但普通新建数组通常使用 0 下界;不要依赖不常见的自定义下界行为编写一般业务代码。

九、Option Strict 与常见错误

在 VB 项目中,建议理解并关注 Option Strict。将其设为 On,可以在编译阶段拦截一部分隐式窄化转换和后期绑定问题,减少“看起来能运行,实际数据被意外转换”的情况。Option Explicit On 则要求变量先声明再使用。较新的项目模板可能已设置其中部分选项;仍应查看项目文件和源文件中的设置,而不要假定所有项目默认相同。

Option Strict On
Option Explicit On

Module Program
    Sub Main()
        Dim text As String = "123"
        Dim value As Integer

        If Integer.TryParse(text, value) Then
            Console.WriteLine(value + 1)
        End If
    End Sub
End Module

常见错误包括:

  • 把文本输入当成数字。Console.ReadLine 读取的是字符串;先解析并验证,再进行计算。
  • 忘记范围与溢出。 类型能表示的范围有限;计算结果也可能超过变量类型的范围。
  • 混淆 = 与不等于写法。 VB 用 = 做相等比较,用 <> 表示不相等。
  • 数组循环多走一次。 长度是元素个数,不是最后一个索引;访问索引前要保证在有效范围内。
  • 忽略大小写不敏感。 两个只在大小写上不同的变量名不是两个不同变量。
  • 用浮点数直接比较精确相等。 浮点计算可能有舍入误差;应根据业务精度设计比较方式。
  • 把格式错误当成程序故障。 对预期可能失败的用户输入,优先用 TryParse 并提供可理解的反馈。

十、完整练习:计算两数之和

下面的完整程序读取两个整数,只有在两次输入都能解析时才计算结果。它使用 Long 保存结果,让可表示范围比单个 Integer 更大;如果两个输入都接近 Integer 的最大值,它们的和仍可能超出 Long 范围,不过本例的输入类型范围保证两个 Integer 相加不会超过 Long 的范围。

Option Strict On
Option Explicit On

Module Program
    Sub Main()
        Dim first As Integer
        Dim second As Integer

        Console.Write("请输入第一个整数:")
        Dim firstText As String = Console.ReadLine()

        If Not Integer.TryParse(firstText, first) Then
            Console.WriteLine("第一个输入不是有效的 32 位整数。")
            Return
        End If

        Console.Write("请输入第二个整数:")
        Dim secondText As String = Console.ReadLine()

        If Not Integer.TryParse(secondText, second) Then
            Console.WriteLine("第二个输入不是有效的 32 位整数。")
            Return
        End If

        Dim sum As Long = CLng(first) + CLng(second)
        Console.WriteLine($"两数之和:{sum}")
    End Sub
End Module

Return 在此处结束当前的 Sub Main。显式使用 CLng 先把操作数提升为 Long,再做加法,避免先按较窄类型运算。对更复杂的运算,还要检查除以 0、日期越界、集合容量和外部资源限制等问题。使用何种类型不能替代业务规则本身的校验。

十一、关于参数限制与安全

语言或框架的类型范围是技术边界,业务允许的范围则由应用决定。两者不要混为一谈:一个能解析为整数的值,未必是合理的商品数量、年龄或页码。应为输入定义合理的最小值、最大值、长度和格式;对批量、递归或高成本操作,还要限制工作量和资源消耗。具体限制应由需求、部署环境和 .NET API 的文档确定,不要凭经验声称所有应用都有统一的输入上限。

VB 本身不会自动让程序安全,也不能代替身份认证、授权、加密或安全审查。若程序连接数据库,应使用数据库驱动提供的参数化命令,而不是把用户输入直接拼接进 SQL 字符串。处理文件路径、命令行参数、网络内容或 HTML 时,应依据对应上下文采用适当的验证和编码方式;单纯删除几个字符并不构成可靠防护。不要把密码、访问令牌或私钥硬编码进源代码或提交到版本库;应根据部署环境使用受控的机密存储机制,并限制访问权限。日志中也不应无差别记录敏感信息。

输入校验的作用是确保数据符合应用预期,不等于对抗一切恶意行为。安全措施需要结合数据流、权限边界和所用组件设计,并以实际框架和服务的安全文档为准。

十二、从第一个程序继续练习

掌握变量、类型、输入解析、条件、循环和方法之后,可以尝试为程序增加循环菜单、重复读取直到输入有效、将计算逻辑拆成可测试的方法,或读取小型配置文件。每次练习都可以先明确输入是什么、允许的范围是什么、失败时如何处理,再决定使用哪种类型和控制结构。

入门阶段最值得养成的习惯,是让类型和边界清楚可见:输入先解析,数值先选对类型,数组先确认索引,外部数据先验证,关键转换显式写出。这样写出的 VB 程序不仅能运行,也更容易解释、测试和维护。

© 版权声明

相关文章