Visual Basic 数据类型
最后修改于 2023 年 10 月 18 日
在本 Visual Basic 教程中,我们将讨论数据类型。
计算机程序处理数据。使用各种数据类型的工具是现代计算机语言的重要组成部分。根据维基百科的定义,数据类型是一组值以及对这些值的允许操作。
Visual Basic 中两种基本数据类型是值类型和引用类型。基本类型(字符串除外)、枚举和结构是值类型。类、字符串、标准模块、接口、数组和委托是引用类型。每个类型都有一个默认值。
引用类型在堆上创建。引用类型的生命周期由 .NET 框架管理。引用类型的默认值是 null 引用。赋值给引用类型的变量会创建引用的副本,而不是引用值的副本。
值类型在栈上创建。生命周期由变量的生命周期决定。赋值给值类型的变量会创建被赋值值的副本。值类型具有不同的默认值。例如,布尔值的默认值为 False,小数值为 0,字符串为空字符串 ""。
布尔值
我们的世界内置了一种二元性。有天堂和地球,水和火,阴和阳,男人和女人,爱和恨。在 Visual Basic 中,Boolean 数据类型是一种基本数据类型,有两个值之一:True 或 False。这是一个基本数据类型。在计算机程序中非常常见。
快乐的父母正在等待孩子的出生。他们为这两种可能性都选择了名字。如果将是一个男孩,他们选择了约翰。如果将是一个女孩,他们选择了杰西卡。
Option Strict On
Module Example
Dim num As Byte
Dim male As Boolean
Sub Main()
Randomize()
num = CType(Math.Round(Rnd()), Byte)
If num = 0 Then
male = True
Else
male = False
End If
If male = True Then
Console.WriteLine("We use name John")
Else
Console.WriteLine("We use name Jessica")
End If
End Sub
End Module
该程序使用随机数生成器来模拟我们的情况。
Dim num As Byte
num 变量具有 Byte 数据类型。这很重要。Byte 数据类型可以具有整数值 0..255。
Randomize() num = CType(Math.Round(Rnd()), Byte)
这两行随机选取 0 或 1。Rnd 函数返回一个小于 1 但大于或等于零的随机值。我们使用 Round 方法对数字进行四舍五入。大于 0.5 的随机值四舍五入为 1。所有其他随机值四舍五入为 0。
Double 数据类型使用 CType 函数转换为 Byte。因此,num 变量被赋值为 0 或 1。Randomize 函数使用基于系统计时器的种子初始化随机数生成器。
If num = 0 Then
male = True
Else
male = False
End If
根据 num 变量,布尔 male 变量设置为 True 或 False。
If male = True Then
Console.WriteLine("We use name John")
Else
Console.WriteLine("We use name Jessica")
End If
如果 male 变量设置为 True,我们选择名字 John。否则,我们选择名字 Jessica。像 If/Else 语句这样的控制结构与布尔值一起使用。
整数
整数是实数的子集。它们没有小数或小数部分。整数属于集合 Z = {..., -2, -1, 0, 1, 2, ...} 整数是无限的。
在计算机语言中,整数是基本数据类型。计算机实际上只能处理整数值的一个子集,因为计算机具有有限的容量。整数用于计算离散实体。我们可以有 3、4、6 个人,但我们不能有 3.33 个人。我们可以有 3.33 公斤。
| VB 别名 | .NET 类型 | 大小 | 范围 |
|---|---|---|---|
SByte |
System.SByte |
1 字节 | -128 到 127 |
Byte |
System.Byte |
1 字节 | 0 到 255 |
Short |
System.Int16 |
2 字节 | -32,768 到 32,767 |
UShort |
System.UInt16 |
2 字节 | 0 到 65,535 |
Integer |
System.Int32 |
4 字节 | -2,147,483,648 到 2,147,483,647 |
UInteger |
System.UInt32 |
4 字节 | 0 到 4,294,967,295 |
Long |
System.Int64 |
8 字节 | -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 |
ULong |
System.UInt64 |
8 字节 | 0 到 18,446,744,073,709,551,615 |
这些整数类型可以根据我们的需要使用。没有人(除了某些圣经上的人)可以活到 120、130 岁。然后我们可以在我们的程序中使用 Byte 类型作为年龄变量。这将节省一些内存。
Option Strict On
Module Example
Sub Main()
Dim a As Byte = 254
Console.WriteLine(a)
a += Cbyte(1)
Console.WriteLine(a)
a += Cbyte(1)
Console.WriteLine(a)
End Sub
End Module
在这个例子中,我们试图分配一个超出数据类型范围的值。编译器以 System.OverflowException: 算术运算导致溢出结束。
a += Cbyte(1)
strict 选项不允许将整数添加到 Byte。 (数字字面量是 Integer 数据类型。)因此,我们使用 Cbyte 函数,它将 Integer 数据类型转换为 Byte。
整数可以在 Visual Basic 中以四种不同的表示法指定:十进制、十六进制、八进制和二进制。八进制值以 &o 开头,十六进制以 &h 开头,二进制以 &B 开头。
Option Strict On
Module Example
Sub Main()
Dim num1 As Integer = 31
Dim num2 As Integer = &o31
Dim num3 As Integer = &h1A
Dim num4 As Integer = &B01001001
Console.WriteLine(num1)
Console.WriteLine(num2)
Console.WriteLine(num3)
Console.WriteLine(num4)
End Sub
End Module
我们使用三种表示法将 31 分配给三个变量。并将它们打印到控制台。
$ dotnet run 31 25 26 73
默认的表示法是十进制。程序以十进制显示这四个数字。
如果我们处理整数,我们就是在处理离散实体。我们会用整数来计数苹果。
Option Strict On
Module Example
Sub Main()
Rem number of baskets
Dim baskets As Short = 16
Rem number of apples in each basket
Dim applesinbasket As Short = 24
Rem total number of apples
Dim total As Short = baskets * applesinbasket
Console.WriteLine($"There are total of {total} apples")
End Sub
End Module
在我们的程序中,我们计算苹果的总数。我们使用乘法运算。
Dim total As Short = baskets * applesinbasket
Short 数据类型足够大,可以计算我们的苹果。
$ dotnet run There are total of 384 apples
浮点数
浮点数在计算中表示实数。实数衡量连续的数量,如重量、高度或速度。在 Visual Basic 中,我们有三种重要的浮点类型:Single、Double 和 Decimal。
| VB 别名 | .NET 类型 | 大小 | 精度 | 范围 |
|---|---|---|---|---|
Single |
System.Single |
4 字节 | 7 位数字 | 1.5 x 10-45 到 3.4 x 1038 |
Double |
System.Double |
8 字节 | 15-16 位数字 | 5.0 x 10-324 到 1.7 x 10308 |
Decimal |
System.Decimal |
16 字节 | 28-29 位小数 | 1.0 x 10-28 到 7.9 x 1028 |
上表给出了浮点类型的特征。
我们可以使用各种语法来创建浮点值。
Option Strict On
Module Example
Sub Main()
Dim n1 As Single = 1.234
Dim n2 As Single = 1.2e-3
Dim n3 As Single = 1 / 3
Console.WriteLine(n1)
Console.WriteLine(n2)
Console.WriteLine(n3)
End Sub
End Module
我们有三种创建浮点值的方法。第一种是使用小数点的“正常”方法。第二种使用科学计数法。最后一种是数值运算的结果。
$ dotnet run 1.234 0.0012 0.3333333
Option Strict On
Module Example
Sub Main()
Dim n1 As Single = 1 / 3
Dim n2 As Double = 1 / 3
If n1 = n2 Then
Console.WriteLine("Numbers are equal")
Else
Console.WriteLine("Numbers are not equal")
End If
End Sub
End Module
Single 和 Double 值以不同的精度存储。比较浮点值时应谨慎。
$ dotnet run Numbers are not equal
并且这些数字不相等。
假设一名短跑运动员跑 100 米用了 9.87 秒。他的速度是多少公里/小时?
Option Strict On
Module Example
Sub Main()
Dim distance As Single
Dim time As Single
Dim speed As Single
Rem 100m is 0.1 km
distance = 0.1
Rem 9.87s is 9.87/60*60 h
time = 9.87 / 3600
speed = distance / time
Console.WriteLine("The average speed of a sprinter is {0} km/h", speed)
End Sub
End Module
在此示例中,必须使用浮点值。
speed = distance / time
为了获得速度,我们将距离除以时间。
$ dotnet run The average speed of a sprinter is 36.47416 km/h
枚举
枚举类型(也称为枚举或 enum)是一种数据类型,由一组命名值组成。声明为具有枚举类型的变量可以被赋予任何枚举器作为值。枚举使代码更具可读性。
Option Strict On
Module Example
Enum Days
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
Sunday
End Enum
Sub Main()
Dim day As Days = Days.Monday
If day = Days.Monday
Console.WriteLine("It is Monday")
End If
Console.WriteLine(day)
End Sub
End Module
在我们的代码示例中,我们为星期几创建一个枚举。
Enum Days
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
Sunday
End Enum
枚举使用 Enum 关键字创建。Monday、Tuesday ... 裸词实际上存储数字 0..6。
Dim day As Days = Days.Monday
我们有一个名为 day 的变量,它是枚举类型 Days。它被初始化为 Monday。
If day = Days.Monday
Console.WriteLine("It is Monday")
End If
如果将 day 变量与某个数字进行比较,则此代码更具可读性。
Console.WriteLine(day)
此行将 0 打印到控制台。对于计算机来说,枚举是一个数字。
我们进一步使用枚举。
Option Strict On
Module Example
Enum Seasons As Byte
Spring = 1
Summer = 2
Autumn = 3
Winter = 4
End Enum
Sub Main()
Dim s1 As Seasons = Seasons.Spring
Dim s2 As Seasons = Seasons.Autumn
Console.WriteLine(s1)
Console.WriteLine(s2)
End Sub
End Module
季节可以很容易地用作枚举。我们可以指定枚举的底层类型,此外,我们可以为它们提供确切的值。
Enum Seasons As Byte
Spring = 1
Summer = 2
Autumn = 3
Winter = 4
End Enum
使用 As 关键字,我们指定枚举的底层类型。我们还为每个成员提供一个特定的数字。
Console.WriteLine(s1) Console.WriteLine(s2)
这两行将 1、3 打印到控制台。
字符串和字符
String 是一种数据类型,表示计算机程序中的文本数据。Visual Basic 中的字符串是一系列 Unicode 字符。Char 是一个单独的 Unicode 字符。字符串用单引号或双引号括起来。
由于字符串在每种编程语言中都非常重要,我们将专门用一章来介绍它们。这里我们只给出一个小例子。
Option Strict On
Module Example
Sub Main()
Dim word As String = "ZetCode"
Dim c As Char = CType(word.SubString(0, 1), Char)
Console.WriteLine(c)
End Sub
End Module
该程序将 Z 字符打印到终端。
Dim word As String = "ZetCode"
在这里,我们创建一个字符串变量并将其赋值为“ZetCode”值。
Dim c As Char = CType(word.SubString(0, 1), Char)
SubString 方法用于从字符串中返回子字符串。该方法返回类型为 String。我们想检索并分配一个字符。这就是为什么我们需要使用 CType 函数将 String 转换为 Char 的原因。字符稍后被打印到终端。
数组
数组是一种复杂的数据类型,它处理元素的集合。可以通过索引访问每个元素。数组的所有元素必须具有相同的数据类型。
我们专门用一章来介绍数组,这里我们只展示一个小例子。
Option Strict On
Module Example
Sub Main()
Dim array(5) As Integer
array(0) = 3
array(1) = 2
array(2) = 1
array(3) = 5
array(4) = 6
For i As Integer = 0 To array.Length-1
Console.WriteLine(i)
Next
End Sub
End Module
在此示例中,我们声明一个数组,用数据填充它,然后将数组的内容打印到控制台。
Dim array(5) As Integer
我们声明一个整数数组,最多可以存储 5 个整数。
array(0) = 3 array(1) = 2 array(2) = 1 array(3) = 5 array(4) = 6
在这里,我们为创建的数组赋值。
For i As Integer = 0 To array.Length-1
Console.WriteLine(i)
Next
我们遍历数组并将数据打印到控制台。数组的 Length 属性为我们提供了所讨论数组的长度。
Date
Date 是值类型,其中包含日期值、时间值或日期和时间值。
Option Strict On
Module Example
Sub Main()
Dim today As Date
today = Now()
System.Console.WriteLine(today)
System.Console.WriteLine(today.ToShortDateString())
System.Console.WriteLine(today.ToShortTimeString())
End Sub
End Module
我们以三种不同的格式显示今天的日期。日期和时间、日期和时间。
Dim today As Date
我们声明一个 Date 数据类型的变量。
today = Now()
返回当前日期和时间,使用计算机的系统日期和时间。
System.Console.WriteLine(today)
此行以完整格式打印日期。
System.Console.WriteLine(today.ToShortDateString()) System.Console.WriteLine(today.ToShortTimeString())
ToShortDateString 返回短日期字符串格式,ToShortTimeString 返回短时间字符串格式。
$ dotnet run 9/3/2022 1:27:35 PM 9/3/2022 1:27 PM
类型转换
我们经常同时使用多种数据类型。将一种数据类型转换为另一种数据类型是编程中的一项常见工作。 类型转换或类型转换是指将一个数据类型的实体更改为另一个数据类型。有两种类型的转换。隐式和显式。隐式类型转换,也称为强制转换,是编译器进行的自动类型转换。
Rem Option Strict On
Module Example
Sub Main()
Dim val As Byte
val = 0.54
Console.WriteLine(val)
Console.WriteLine(12 + 12.5)
Console.WriteLine("12" + 12)
Console.WriteLine("12" & 12)
End Sub
End Module
在这个例子中,我们有一堆隐式转换。
Rem Option Strict On
当 Option Strict 语句打开时,某些隐式转换是不可能的。
val = 0.54
一个浮点值被分配给一个 Byte 数据类型的变量。它是一种整数数据类型。该值四舍五入为 1;会丢失一些精度。这是一个缩小隐式转换。
Console.WriteLine(12 + 12.5)
我们添加两个值。一个整数和一个浮点值。结果是一个浮点值。这是一个扩大隐式转换。
Console.WriteLine("12" + 12)
结果是 24。字符串被隐式转换为数字。
Console.WriteLine("12" & 12)
结果是 1212。一个整数被转换为一个字符串,并且这两个字符串被添加在一起。
接下来我们展示 Visual Basic 中的一些显式转换。
| 函数 | 转换为 |
|---|---|
CBool | Boolean |
CByte | Byte |
CChar | Unicode 字符 |
CDate | Date |
CDb1 | Double |
| CDec | Decimal |
Clnt | Integer |
CLng | Long |
CObj | 对象 |
CShort | Short |
CSng | Single |
CStr | String |
我们有几个函数来执行显式转换。
Option Strict On
Module Example
Sub Main()
Console.WriteLine(CByte(0.4))
Console.WriteLine(CByte(0.9))
Console.WriteLine(CShort(12 + 12.5))
Console.WriteLine(Val("1071 Fifth Avenue"))
End Sub
End Module
在程序中,我们执行三种类型的转换。
Console.WriteLine(CByte(0.4)) Console.WriteLine(CByte(0.9))
这两行执行缩小显式转换。第一个数字四舍五入为 0,第二个四舍五入为 1。
Console.WriteLine(Val("1071 Fifth Avenue"))
Val 函数返回字符串中包含的数字。在我们的例子中是 1071。
$ dotnet run 0 1 24 1071
在本 Visual Basic 教程中,我们介绍了数据类型及其转换。