ZetCode

Visual Basic 数据类型

最后修改于 2023 年 10 月 18 日

在本 Visual Basic 教程中,我们将讨论数据类型。

计算机程序处理数据。使用各种数据类型的工具是现代计算机语言的重要组成部分。根据维基百科的定义,数据类型是一组值以及对这些值的允许操作。

Visual Basic 中两种基本数据类型是值类型和引用类型。基本类型(字符串除外)、枚举和结构是值类型。类、字符串、标准模块、接口、数组和委托是引用类型。每个类型都有一个默认值。

引用类型在堆上创建。引用类型的生命周期由 .NET 框架管理。引用类型的默认值是 null 引用。赋值给引用类型的变量会创建引用的副本,而不是引用值的副本。

值类型在栈上创建。生命周期由变量的生命周期决定。赋值给值类型的变量会创建被赋值值的副本。值类型具有不同的默认值。例如,布尔值的默认值为 False,小数值为 0,字符串为空字符串 ""。

布尔值

我们的世界内置了一种二元性。有天堂和地球,水和火,阴和阳,男人和女人,爱和恨。在 Visual Basic 中,Boolean 数据类型是一种基本数据类型,有两个值之一:True 或 False。这是一个基本数据类型。在计算机程序中非常常见。

快乐的父母正在等待孩子的出生。他们为这两种可能性都选择了名字。如果将是一个男孩,他们选择了约翰。如果将是一个女孩,他们选择了杰西卡。

Program.vb
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 类型作为年龄变量。这将节省一些内存。

Program.vb
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 开头。

Program.vb
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

默认的表示法是十进制。程序以十进制显示这四个数字。

如果我们处理整数,我们就是在处理离散实体。我们会用整数来计数苹果。

Program.vb
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 中,我们有三种重要的浮点类型:SingleDoubleDecimal

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

上表给出了浮点类型的特征。

我们可以使用各种语法来创建浮点值。

Program.vb
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
Program.vb
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

SingleDouble 值以不同的精度存储。比较浮点值时应谨慎。

$ dotnet run
Numbers are not equal

并且这些数字不相等。

假设一名短跑运动员跑 100 米用了 9.87 秒。他的速度是多少公里/小时?

Program.vb
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)是一种数据类型,由一组命名值组成。声明为具有枚举类型的变量可以被赋予任何枚举器作为值。枚举使代码更具可读性。

Program.vb
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

在我们的代码示例中,我们为星期几创建一个枚举。

Program.vb
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 打印到控制台。对于计算机来说,枚举是一个数字。

我们进一步使用枚举。

Program.vb
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 字符。字符串用单引号或双引号括起来。

由于字符串在每种编程语言中都非常重要,我们将专门用一章来介绍它们。这里我们只给出一个小例子。

Program.vb
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 的原因。字符稍后被打印到终端。

数组

数组是一种复杂的数据类型,它处理元素的集合。可以通过索引访问每个元素。数组的所有元素必须具有相同的数据类型。

我们专门用一章来介绍数组,这里我们只展示一个小例子。

Program.vb
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 是值类型,其中包含日期值、时间值或日期和时间值。

Program.vb
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

类型转换

我们经常同时使用多种数据类型。将一种数据类型转换为另一种数据类型是编程中的一项常见工作。 类型转换类型转换是指将一个数据类型的实体更改为另一个数据类型。有两种类型的转换。隐式和显式。隐式类型转换,也称为强制转换,是编译器进行的自动类型转换。

Program.vb
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 中的一些显式转换。

函数转换为
CBoolBoolean
CByteByte
CCharUnicode 字符
CDateDate
CDb1Double
CDecDecimal
ClntInteger
CLngLong
CObj对象
CShortShort
CSngSingle
CStrString

我们有几个函数来执行显式转换。

Program.vb
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 教程中,我们介绍了数据类型及其转换。