在 Visual Basic 教程的这一部分中,我们将讨论数据类型。
计算机程序可以处理数据。 用于各种数据类型的工具是现代计算机语言的基本组成部分。 根据维基百科的定义,data type
是一组值,以及对这些值的允许操作。
Visual Basic 中的两种基本数据类型是值类型和引用类型。 基本类型(字符串除外),枚举和结构是值类型。 类,字符串,标准模块,接口,数组和委托是引用类型。 每种类型都有一个默认值。 引用类型在堆上创建。 引用类型的生存期由 .NET 框架管理。 引用类型的默认值为空引用。 分配给引用类型的变量会创建引用的副本,而不是引用值的副本。 值类型在栈上创建。 生存期由变量的生存期决定。 分配给值类型的变量会创建要分配的值的副本。 值类型具有不同的默认值。 例如,布尔默认值为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 will use name John")
Else
Console.WriteLine("We will use name Jessica")
End If
End Sub
End Module
该程序使用随机数生成器来模拟我们的情况。
Dim num As Byte
num
变量具有Byte
数据类型。 这个很重要。 字节数据类型的整数值可以为0..255
。
Randomize()
num = CType(Math.Round(Rnd()), Byte)
这两行随机取 0 或 1。Rnd()
函数返回小于 1 但大于或等于 0 的随机值。 我们使用Round()
方法将数字四舍五入。 大于 0.5 的随机值将四舍五入为 1。所有其他随机值将四舍五入为零。使用CType()
函数将Double
数据类型转换为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 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
类型用于年龄变量。 这样可以节省一些内存。
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
开头。
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 分配给三个变量。 然后将它们打印到控制台。
$ mono intnotations.exe
31
25
49
默认符号是十进制。 程序以十进制显示这三个数字。
如果我们使用整数,那么我们将处理离散实体。 我们将使用整数来计算苹果。
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
在我们的程序中,我们计算了苹果的总量。 我们使用乘法运算。
$ 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 |
上表给出了浮点类型的特征。
我们可以使用各种语法来创建浮点值。
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
我们有三种创建浮点值的方法。 第一种是使用小数点的“正常”方式。 第二种使用科学计数法。 最后一个是数字运算的结果。
$ mono fnotations.exe
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
值以不同的精度存储。 比较浮点值时应格外小心。
$ mono fequal.exe
Numbers are not equal
而且数字不相等。
假设一个短跑运动员跑了 1 个小时,跑了 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
为了获得速度,我们将距离除以时间。
$ 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 教程的这一部分中,我们介绍了数据类型及其转换。