# Visual Basic 数据类型

> 原文： [https://zetcode.com/lang/visualbasic/datatypes/](https://zetcode.com/lang/visualbasic/datatypes/)

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

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

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

## 布尔值

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

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

```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 will use name John")
        Else
            Console.WriteLine("We will use name Jessica")
        End If

    End Sub

End Module

```

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

```vb
Dim num As Byte

```

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

```vb
Randomize()
num = CType(Math.Round(Rnd()), Byte)

```

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

```vb
If num = 0 Then
    male = True
Else
    male = False
End If

```

根据`num`变量，布尔值`male`变量设置为`True`或`False`。

```vb
If male = True Then
    Console.WriteLine("We will use name John")
Else
    Console.WriteLine("We will use name Jessica")
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`类型用于年龄变量。 这样可以节省一些内存。

```vb
Option Strict On

Module Example

    Sub Main()

        Dim a As Byte = 254

        Console.WriteLine(a)
        a += 1
        Console.WriteLine(a)
        a += 1
        Console.WriteLine(a)

    End Sub

End Module

```

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

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

```vb
Option Strict On

Module Example

    Sub Main()

        Dim num1 As Byte = 31
        Dim num2 As Byte = &o31
        Dim num3 As Byte = &h31

        Console.WriteLine(num1)
        Console.WriteLine(num2)
        Console.WriteLine(num3)

    End Sub

End Module

```

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

```vb
$ mono intnotations.exe 
31
25
49

```

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

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

```vb
Option Strict On

Module Example

    Sub Main()

        Rem number of baskets
        Dim baskets As Byte = 16

        Rem number of apples in each basket 
        Dim apples_in_basket As Byte = 24

        Rem total number of apples
        Dim total As Short = baskets * apples_in_basket

        Console.WriteLine("There are total of {0} apples", total)

    End Sub

End Module

```

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

```vb
$ mono apples.exe 
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 10^38` |
| `Double` | `System.Double` | 8 字节 | 15-16 位数 | `5.0 x 10^-324`至`1.7 x 10^308` |
| `Decimal` | `System.Decimal` | 16 字节 | 28-29 位小数 | `1.0 x 10^-28`至`7.9 x 10^28` |

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

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

```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

```

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

```vb
$ mono fnotations.exe 
1.234
0.0012
0.3333333

```

这是上面程序的输出。

```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

```

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

```vb
$ mono fequal.exe 
Numbers are not equal

```

而且数字不相等。

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

```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

```

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

```vb
speed = distance / time

```

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

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

```

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

## 枚举

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

```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

```

在我们的代码示例中，我们为工作日创建一个枚举。

```vb
Enum Days
    Monday
    Tuesday
    Wednesday
    Thursday
    Friday
    Saturday
    Sunday
End Enum

```

使用`Enum`关键字创建枚举。 星期一，星期二...星期日实际上存储数字`0..6`。

```vb
Dim day As Days = Days.Monday

```

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

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

```

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

```vb
Console.WriteLine(day)

```

此行将 0 打印到控制台。 对于计算机，枚举是数字。

我们会进一步进行枚举。

```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

```

季节可以很容易地用作枚举。 我们可以为枚举指定基础类型，还可以为其提供确切的值。

```vb
Enum Seasons As Byte
    Spring = 1
    Summer = 2
    Autumn = 3
    Winter = 4
End Enum

```

使用`As`关键字，我们指定枚举的基础类型。 我们还给每个成员一个特定的号码。

```vb
Console.WriteLine(s1)
Console.WriteLine(s2)

```

这两行将 1、3 打印到控制台。

## 字符串和字符

`String`是代表计算机程序中文本数据的数据类型。 Visual Basic 中的字符串是 Unicode 字符序列。 `Char`是单个 Unicode 字符。 字符串用单引号或双引号引起来。

由于字符串在每种编程语言中都非常重要，因此我们将为它们专门整整一章。 在这里，我们仅举一个小例子。

```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`字符打印到终端。

```vb
Dim word As String = "ZetCode"

```

在这里，我们创建一个字符串变量，并为其分配`"ZetCode"`值。

```vb
Dim c As Char = CType(word.SubString(0, 1), Char)

```

`SubString()`方法用于从字符串返回子字符串。 方法返回类型为`String`。 我们要检索并分配一个字符。 这就是为什么我们需要使用`CType`函数将`String`转换为`Char`的原因。 字符随后被打印到终端。

## 数组

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

我们将一整章专门介绍数组，这里仅显示一个小例子。

```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

```

在此示例中，我们声明一个数组，用数据填充它，然后将数组的内容打印到控制台。

```vb
Dim array(5) As Integer

```

我们声明一个整数数组，该数组最多可以存储 5 个整数。

```vb
array(0) = 3
array(1) = 2
array(2) = 1
array(3) = 5
array(4) = 6

```

在这里，我们为创建的数组分配值。

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

```

我们遍历数组并将数据打印到控制台。 数组的`Length`属性为我们提供了相关数组的长度。

## 日期

`Date`是值类型，其中包含日期值，时间值或日期和时间值。

```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

```

我们以三种不同的格式显示今天的日期。 日期&时间，日期和时间。

```vb
Dim today As Date

```

我们声明一个`Date`数据类型的变量。

```vb
today = Now()

```

返回当前日期和时间，使用计算机的系统日期和时间。

```vb
System.Console.WriteLine(today)

```

此行以完整格式打印日期。

```vb
System.Console.WriteLine(today.ToShortDateString())
System.Console.WriteLine(today.ToShortTimeString())

```

`ToShortDateString()`返回短日期字符串格式，`ToShortTimeString()`返回短时间字符串格式。

```vb
$ mono date.exe 
8/17/2010 1:19:05 PM
8/17/2010
1:19 PM

```

示例的输出。

## 类型转换

我们经常一次处理多种数据类型。 将一种数据类型转换为另一种数据类型是编程中的常见工作。 类型转换或类型转换是指将一种数据类型的实体更改为另一种。 有两种类型的转换。 隐式和显式。 隐式类型转换，也称为强制转换，是编译器自动进行的类型转换。

```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

```

在此示例中，我们有一堆隐式转换。

```vb
Rem Option Strict On

```

当`Option Strict`语句为`On`时，某些隐式转换是不可能的。 这就是为什么我们注释这一行。

```vb
val = 0.54

```

浮点值分配给`Byte`数据类型的变量。 它是整数数据类型。 取整为 1； 失去一些精度。 这是缩小隐式转换。

```vb
Console.WriteLine(12 + 12.5)

```

我们添加两个值。 一整数和一浮点值。 结果是浮点值。 这是扩展的隐式转换。

```vb
Console.WriteLine("12" + 12) 

```

结果为 24。该字符串被隐式转换为数字。

```vb
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` |

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

```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

```

在程序中，我们执行三种类型的转换。

```vb
Console.WriteLine(CByte(0.4))
Console.WriteLine(CByte(0.9))

```

这两行执行缩小的显式转换。 第一个数字四舍五入为 0，第二个数字四舍五入为 1。

```vb
Console.WriteLine(Val("1071 Fifth Avenue"))

```

`Val()`函数返回字符串中包含的数字。 在我们的情况下为 1071。

```vb
$ mono explicit.exe 
0
1
24
1071

```

示例的输出。

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