2.2 数据类型

数据类型是用抽象的方式来描述客观事物的一种定义,这样就可以通过计算机语言来描述客观事物。举个简单的例子,在日常生活中有日期和货币这两种实际的事物,如果想要在计算机中表示这两种客观的事物,必须采用相对应的数据类型进行描述。而在计算机数据类型中,专门有日期型数据和货币型数据分别来描述日期和货币,如图2.2所示。

图2.2 数据类型

不同的数据类型定义不同的数据存储方式。为了能用计算机语言准确地描述客观事物,用户需要选择准确的数据类型与之对应。Visual Basic 6.0提供了丰富的数据类型,同时支持自定义的数据类型。本节内容主要介绍Visual Basic 6.0的标准数据类型和自定义数据类型。

2.2.1 基本数据类型

基本数据类型是由Visual Basic 6.0提供给用户的数据类型,无须重新定义就可以直接用来声明变量或常量。基本数据类型具体有以下几类。

1.数值型数据类型

· 整型(Integer):用于保存整数,范围大小为-32768~32767,存储空间为2字节。类型声明符为%,用类型声明符可以更方便地声明数据类型。例如,-455、-455%都表示整型数据。

· 长整型(Long):用于保存整数,范围大小为-2147 483648~2147 438647,存储空间为4字节。类型声明符为&。例如,455&。

· 单精度型(Single):用于保存浮点数,范围大小为-3.402823E38~-1.4011298E-45;1.401298E-45~3.402823E38,存储空间为4字节。类型声明符为!。例如,1.455和1.455!。

· 双精度型(Double):用于保存浮点数,范围大小为±4.94D-324~±1.79D308,存储空间为8字节。类型声明符为#。例如,3.795#和3.795都表示双精度浮点数。

· 货币型(Currency):用于货币计算,存储空间为8字节。类型声明符为@。例如,88.56@。

· 字节型(Byte):用于保存无符号二进制数据,范围大小为0~255,存储空间为1字节。

2.字符型数据类型

字符型数据类型用于存放字符串,字符包括所有ASCII字符和汉字字符。字符型数据类型用双引号""括起来表示。类型声明符为$。例如,"hello world!"、"123"、"Visual Basic 6.0基础教程"等。默认初始值为空。字符型数据类型分为两类。

· 变长字符型:表示字符串长度是可变的,用户一般定义的字符串都属于变长字符型。范围大小为1~(约)20亿个字符。

· 定长字符型:表示字符串长度固定不变,由用户声明字符串长度后,在计算机内存中分配的存储空间固定不变。范围大小为1~(约)65400个字符。例如:

Dim strAddr As String*40

这个语句表示了定义字符串变量strAddr的长度为40个字符,如果用户给strAddr赋值字符个数多于40个,系统会自动截断超出的字符。

【范例2-1】变长字符型和固定字符型的区别如示例代码2-1所示。

示例代码2-1

01  Option Explicit
02  '变长字符型与定长字符型的区别
03  Private Sub Form_Load()
04     Dim str1 As String * 5                       '定义定长字符串
05     Dim str2 As String                           '定义变长字符串
06
07     str1 = "123456"                              '定长字符串赋值
08     str2 = "123456"                              '变长字符串赋值
09
10     Print Chr(13)                          '输出空行 也可以直接使用Print
11     Print "定长字符型:" + str1 + Chr(13)   '输出结果
12     Print "变长字符型:" + str2
13  End Sub

【运行结果】按下“F5”键运行程序,显示结果如图2.3所示。

图2.3 变长字符型和定长字符型的区别

【代码解析】从显示结果可以看出,对于定长字符“str1”,如果赋值超过其固定长度5,多余的字符会被截断,在以上代码中将超过长度的字符“6”截断,输出结果变为“12345”。而对于变长字符串str2,输出结果仍然为“123456”。这就是定长字符和变长字符串的区别。

警告

定长字符串的使用必须注意其长度,对于一些比较重要的应用,很可能因为错误地指定了字符串长度而造成错误的运行结果。

3.逻辑型数据类型

逻辑型数据类型用于逻辑判断,也就是平时所说的真和假。它只有真(True)和假(False)两个取值。占据的存储空间为1字节。在代码编写中常常用True和False表示。默认值为False。逻辑型数据类型也可以和数值型数据类型进行转换。具体的转换应遵循以下两个规则。

· 逻辑型转换为数值型数据类型时,False转换为0,True转换为-1。

· 数值型转换为逻辑型数据类型时,0转换为False,非0转换为True。

这两个转换规则读者应该给予一定的重视,因为在很多的函数返回值中常常是返回零或非零的整数值。按照上述规则,如果返回值为零,则表示函数执行失败;如果返回非零值,则表示函数执行成功。

4.日期型数据类型

日期型数据类型用于存放日期和时间。赋值的时候日期型数据类型必须用两个“#”符号括起来。例如,#2008-01-10#、#10/01/2008#、#2 Jan,2008#、#1/10/2008 3:12:22 PM#。

5.枚举型数据类型

枚举型数据类型是当一个变量有两个或者两个以上的值时,可以通过定义枚举型数据类型来声明。这个变量中每个成员的值称为枚举值,具体的语法如下。

[Public/Private] Enum<枚举数据名称>
    <成员1>[=<表达式>]
    <成员2>[=<表达式>]
    <成员3>[=<表达式>]
………
    <成员n>[=<表达式>]
End Enum

参数说明如下所示。

· Public:表示该枚举类型在整个工程中可见,是枚举类型默认值。

· Private:表示该枚举类型只在声明模块中可见。

· 枚举数据类型:表示该枚举类型的名称。

· 成员n:表示该枚举类型的组成元素的名称。

· 表达式:表示成员n的赋值。

枚举类型是非常有用的数据类型,可以描述日常生活中的客观事物。例如,“星期”这个概念就可以用枚举类型来描述。用枚举类型描述星期的概念,具体代码如下所示。

01  Enum Week                                  '定义枚举类型Week
02       Monday=1                               '星期一
03       Tuesday=2                              '星期二
04       Wednesday=3                            '星期三
05       Thursday=4                             '星期四
06       Friday=5                               '星期五
07       Saturday=6                             '星期六
08       Sunday=7                               '星期日
09  End Enum

这样,在代码编写中就可以用Week这个枚举类型数据来定义星期类型的变量了。

6.变体型数据类型

变体型数据类型也被称为通用数据类型,这是为了方便数据的处理而增加的一种数据类型。在Microsoft公司开发的COM技术中,这是一种常用的数据类型。变体型数据类型中可以存储任何数据类型,包括前面介绍的数值型、字符型和日期型等数据类型。变体型数据类型的存储空间是根据实际需要进行分配的。

注意

变体型数据类型可以存储任何数据类型,有些读者可能会想:“在代码编写中将所有的变量都声明成变体型数据类型不是方便了很多吗?”。但是,看起来方便,其实不然,建议读者在代码编写时应尽量少使用变体型数据类型。因为如果声明数据变量为变体型数据类型,在变量存储空间分配、变量类型转换等环节都会有不小的系统开销。与其这样,不如在声明变量时,明确变量的类型。

2.2.2 自定义数据类型

上述的基本数据类型只能描述很少的客观事物,用户在编写代码的时候会感到数据类型不够用。有时会希望能够将不同的数据类型组合成为一种新的类型来描述客观事物。例如,如果想在计算机中描述一个“学生”对象,需要定义“学生”的学号、姓名及性别等信息。可以用自定义数据类型来定义“学生”对象,如图2.4所示为用自定义数据类型来描述“学生”对象。

图2.4 “学生”对象

因此,Visual Basic 6.0允许自定义数据类型。自定义数据类型是由基本数据类型组合构成的,用户可以通过以下的语法来定义自定义数据类型。

[Public/Private] Type<类型名称>
    <元素名称1>[(<下标>)]As<基本数据类型>
    <元素名称2>[(<下标>)]As<基本数据类型>
……
    <元素名称n>[(<下标>)]As<基本数据类型>
End Type

参数说明如下所示。

· 类型名称:表示该自定义类型的名称。

· 元素名称n:表示该自定义类型的元素的名称。

· 下标:表示数组元素的维数。

· 基本数据类型:可以是其他基本数据类型、用户自定义的类型和对象类型。

提示

自定义数据类型的使用在程序开发中非常普遍,也是非常有用的。自定义类型的数据可以用“变量名.元素名”的形式来引用。

【范例2-2】在数据库应用程序设计中,公司的职员是非常常见的一种客观实体。在进行程序设计时,必须对职员进行定义,然后才能让计算机进行处理。可是基本数据类型中并没有现成的数据类型供用户使用,那么就必须自己定义“职员”这种数据类型。

对于一个职员,最基本的属性有姓名、年龄及住址。也许还有其他的属性,在这里为了方便介绍,暂时采用这3种。首先在代码窗口中定义“职员”类型数据,如示例代码2-2所示。

示例代码2-2

01  Option Explicit
02  '定义一个职员的数据类型
03  Private Type Employee
04     empName As String                       '职员姓名
05     empAge As Integer                       '职员年龄
06     empAddr As String                       '职员住址
07  End Type
08
09  Dim emp1 As Employee                              '声明一个Employee类型的变量
10  Private Sub Form_Load()
11       emp1.empName = "刘备"                        'emp1对象empName成员赋值
12       emp1.empAge = "35"                           'emp1对象empAge成员赋值
13       emp1.empAddr = "蜀国"                        'emp1对象empAddr成员赋值
14
15       Print                                        '输出结果
16       Print emp1.empName & " " & emp1.empAge & " " & emp1.empAddr
17  End Sub

【运行结果】按下“F5”键运行程序,结果如图2.5所示。

图2.5 自定义数据类型演示

【代码解析】这段代码演示了如何定义一个自定义的数据类型并对其进行相关的操作。代码中根据实际的职员所具备的属性定义了一个Employee数据类型,然后通过代码的第11~13行为emp1变量赋值,最后通过代码的第16行将结果输出到窗体上。