原文: https://zetcode.com/lang/visualbasic/datatypes/

在 Visual Basic 教程的这一部分中,我们将讨论数据类型。

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

Visual Basic 中的两种基本数据类型是值类型和引用类型。 基本类型(字符串除外),枚举和结构是值类型。 类,字符串,标准模块,接口,数组和委托是引用类型。 每种类型都有一个默认值。 引用类型在堆上创建。 引用类型的生存期由 .NET 框架管理。 引用类型的默认值为空引用。 分配给引用类型的变量会创建引用的副本,而不是引用值的副本。 值类型在栈上创建。 生存期由变量的生存期决定。 分配给值类型的变量会创建要分配的值的副本。 值类型具有不同的默认值。 例如,布尔默认值为False,十进制为 0,字符串为空字符串""

布尔值

我们的世界建立了双重性。 有天与地,水与火,阴与阳,男人与女人,爱与恨。 在 Visual Basic 中,Boolean数据类型是具有以下两个值之一的原始数据类型:TrueFalse。 这是基本的数据类型。 在计算机程序中非常常见。

快乐的父母正在等待孩子的出生。 他们为两种可能性都选择了名称。 如果要成为男孩,他们选择了约翰。 如果要成为女孩,他们会选择杰西卡。

  1. Option Strict On
  2. Module Example
  3. Dim num As Byte
  4. Dim male As Boolean
  5. Sub Main()
  6. Randomize()
  7. num = CType(Math.Round(Rnd()), Byte)
  8. If num = 0 Then
  9. male = True
  10. Else
  11. male = False
  12. End If
  13. If male = True Then
  14. Console.WriteLine("We will use name John")
  15. Else
  16. Console.WriteLine("We will use name Jessica")
  17. End If
  18. End Sub
  19. End Module

该程序使用随机数生成器来模拟我们的情况。

  1. Dim num As Byte

num变量具有Byte数据类型。 这个很重要。 字节数据类型的整数值可以为0..255

  1. Randomize()
  2. num = CType(Math.Round(Rnd()), Byte)

这两行随机取 0 或 1。Rnd()函数返回小于 1 但大于或等于 0 的随机值。 我们使用Round()方法将数字四舍五入。 大于 0.5 的随机值将四舍五入为 1。所有其他随机值将四舍五入为零。使用CType()函数将Double数据类型转换为Byte。 因此,将num变量分配为 0 或 1。Randomize()函数根据系统计时器初始化带有种子的随机数生成器。

  1. If num = 0 Then
  2. male = True
  3. Else
  4. male = False
  5. End If

根据num变量,布尔值male变量设置为TrueFalse

  1. If male = True Then
  2. Console.WriteLine("We will use name John")
  3. Else
  4. Console.WriteLine("We will use name Jessica")
  5. End If

如果将男性变量设置为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类型用于年龄变量。 这样可以节省一些内存。

  1. Option Strict On
  2. Module Example
  3. Sub Main()
  4. Dim a As Byte = 254
  5. Console.WriteLine(a)
  6. a += 1
  7. Console.WriteLine(a)
  8. a += 1
  9. Console.WriteLine(a)
  10. End Sub
  11. End Module

在此示例中,我们尝试分配一个超出数据类型范围的值。 Mono 编译器给出System.OverflowException。 Visual Basic 2008 Express 将不会编译此示例。

在 Visual Basic 中,可以使用三种不同的表示法指定整数:十进制,十六进制和八进制。 八进制值以&o开头,十六进制以&h开头。

  1. Option Strict On
  2. Module Example
  3. Sub Main()
  4. Dim num1 As Byte = 31
  5. Dim num2 As Byte = &o31
  6. Dim num3 As Byte = &h31
  7. Console.WriteLine(num1)
  8. Console.WriteLine(num2)
  9. Console.WriteLine(num3)
  10. End Sub
  11. End Module

我们使用三个符号将 31 分配给三个变量。 然后将它们打印到控制台。

  1. $ mono intnotations.exe
  2. 31
  3. 25
  4. 49

默认符号是十进制。 程序以十进制显示这三个数字。

如果我们使用整数,那么我们将处理离散实体。 我们将使用整数来计算苹果。

  1. Option Strict On
  2. Module Example
  3. Sub Main()
  4. Rem number of baskets
  5. Dim baskets As Byte = 16
  6. Rem number of apples in each basket
  7. Dim apples_in_basket As Byte = 24
  8. Rem total number of apples
  9. Dim total As Short = baskets * apples_in_basket
  10. Console.WriteLine("There are total of {0} apples", total)
  11. End Sub
  12. End Module

在我们的程序中,我们计算了苹果的总量。 我们使用乘法运算。

  1. $ mono apples.exe
  2. There are total of 384 apples

程序的输出。

浮点数

浮点数表示计算中的实数。 实数测量连续的数量,例如重量,高度或速度。 在 Visual Basic 中,我们有三种重要的浮点类型:SingleDoubleDecimal

VB 别名 .NET 类型 大小 精度 范围
Single System.Single 4 字节 7 位数 1.5 x 10^-453.4 x 10^38
Double System.Double 8 字节 15-16 位数 5.0 x 10^-3241.7 x 10^308
Decimal System.Decimal 16 字节 28-29 位小数 1.0 x 10^-287.9 x 10^28

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

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

  1. Option Strict On
  2. Module Example
  3. Sub Main()
  4. Dim n1 As Single = 1.234
  5. Dim n2 As Single = 1.2e-3
  6. Dim n3 As Single = 1 / 3
  7. Console.WriteLine(n1)
  8. Console.WriteLine(n2)
  9. Console.WriteLine(n3)
  10. End Sub
  11. End Module

我们有三种创建浮点值的方法。 第一种是使用小数点的“正常”方式。 第二种使用科学计数法。 最后一个是数字运算的结果。

  1. $ mono fnotations.exe
  2. 1.234
  3. 0.0012
  4. 0.3333333

这是上面程序的输出。

  1. Option Strict On
  2. Module Example
  3. Sub Main()
  4. Dim n1 As Single = 1 / 3
  5. Dim n2 As Double = 1 / 3
  6. If n1 = n2 Then
  7. Console.WriteLine("Numbers are equal")
  8. Else
  9. Console.WriteLine("Numbers are not equal")
  10. End If
  11. End Sub
  12. End Module

SingleDouble值以不同的精度存储。 比较浮点值时应格外小心。

  1. $ mono fequal.exe
  2. Numbers are not equal

而且数字不相等。

假设一个短跑运动员跑了 1 个小时,跑了 9.87 秒。 他的公里/小时速度是多少?

  1. Option Strict On
  2. Module Example
  3. Sub Main()
  4. Dim distance As Single
  5. Dim time As Single
  6. Dim speed As Single
  7. Rem 100m is 0.1 km
  8. distance = 0.1
  9. Rem 9.87s is 9.87/60*60 h
  10. time = 9.87 / 3600
  11. speed = distance / time
  12. Console.WriteLine("The average speed of a sprinter is {0} km/h", speed)
  13. End Sub
  14. End Module

在此示例中,必须使用浮点值。

speed = distance / time

为了获得速度,我们将距离除以时间。

$ mono sprinter.exe 
The average speed of a sprinter is 36.47416 km/h

这是短跑运动员程序的输出。

枚举

枚举类型(也称为枚举或枚举)是由一组命名值组成的数据类型。 可以将任何枚举器分配为已声明为具有枚举类型的变量作为值。 枚举使代码更具可读性。

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关键字创建枚举。 星期一,星期二…星期日实际上存储数字0..6

Dim day As Days = Days.Monday

我们有一个名为day的变量,其类型为Days。 它被初始化为星期一。

If day = Days.Monday
    Console.WriteLine("It is Monday")
End If

与将日变量与某个数字进行比较相比,此代码更具可读性。

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

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()返回短时间字符串格式。

$ mono date.exe 
8/17/2010 1:19:05 PM
8/17/2010
1:19 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语句为On时,某些隐式转换是不可能的。 这就是为什么我们注释这一行。

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 character
CDate Date
CDb1 Double
CDec Decimal
CInt Integer
CLng Long
CObj Object
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。

$ mono explicit.exe 
0
1
24
1071

示例的输出。

在 Visual Basic 教程的这一部分中,我们介绍了数据类型及其转换。