不定类型

不定类型是目前编程语言中所拥有的一种资料类型,常用于Visual BasicC++中。

在Visual Basic(及Visual Basic for Applications)中,不定类型是一种标签联合,用以表达任何一种资料类型(例如整数双精度单精度浮点数物件等等),除了固定长度字符串英语Fixed-length string结构体。任何在Visual Basic中并未明确指定资料类型的变量,也会被当成不定类型来进行处理。

尽管不明确地宣告变量类型是一个不太好的习惯,但当一个资料的类型只有在执行时期才能被确定时,它就显得相当的有用。实际上一部分动态类型的编程语言里,通常就只有不定类型这一种资料类型。

Visual Basic.NET里,因为面向对象概念被引入,所以不定类型被.NET的Object类型所取代。Object类型和不定类型在概念上很相似,但却大大不同,而且无法互相转换。当Visual Basic.NET需要与Visual Basic的COM物件交互,通常需要先透过.NET的一些程序进行转换。

示例

在Visual Basic,一个变量可以透过明确或含糊的宣告,令它成为一个不定类型的变量:

Dim A
Dim A as Variant

如果在 Delphi想要这样做,则可使用如下的代码:

var A: variant;

格式

在Visual Basic中,一个不定类型需要使用16个字节的空间去存储资料;

偏移 大小 说明
0 2 VarType,用以记录此一不定型所存储的数据类型。
2 6 空白,必须被设成0。
8 小于等于8 此一变量实际存储的资料。

类型

以下为在Visual Basic中不定型可能会存储的资料类型:

VarType 资料类型 C类型 类型名称
0 Empty1
1 Null2
10 2A000A80 HRESULT (长整数) Error
10 80020004 HRESULT (长整数) Missing3
17 2A 字节 (无符号字符) 字节
11 FFFF VARIANT_BOOL (短整数) 布尔值
2 2A00 短整数 整数
3 2A000000 长整数 长整数
4 00002842 浮点数 单精度浮点数
5 0000000000004540 双精度浮点数 双精度浮点数
6 A068060000000000 CY结构 货币
7 00000000C0D5E140 日期(双精度浮点数) 日期
8 xxxxxxxx BSTR (阔字符指针 字符串
9 00000000 IUnknown指针 Nothing4
9 xxxxxxxx IUnknown指针 对象参址5
  • 1 代表一个尚未被初始化的不定类型
  • 2 代表数据库里没有资料的字段,即NULL。此NULL不应与未初始化的变量,或是C语言里的NULL指针混淆。
  • 3 一般用在调用函数时。当一个函数的参数被省略,那么就会传入这个数值代替。
  • 4 代表此对象的参址被设为NULL。
  • 5 代表此变量是一个指向一个物件的界面的指针,也就是说它会指向该物件的函数指针表。

应用

集合

OLE里,一个集合可以存放各种不同资料类型的资料。因为在编译时期里面所存储的资料一般难以预测,所以集合里用来加入资料或读取资料的函数一般都是使用不定类型。

可选参数

在Visual Basic,一个函数的参数可以使用Optional关键字,把它设成一个可选的参数。当使用这个函数时可选参数没有被传入,那么Visual Basic就会用一个叫Missing的特别数值取代被省略的参数。

Function GetText(Optional ByVal Index) As String
    If IsMissing(Index) Then
        GetText = Item(CurrentItem)
    Else
        GetText = Item(Index)
    End If
End Function