# 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 教程的这一部分中,我们介绍了数据类型及其转换。