不定型别
此条目没有列出任何参考或来源。 (2012年8月4日) |
不定型别是目前程式语言中所拥有的一种资料型别,常用于Visual Basic及C++中。
在Visual Basic(及Visual Basic for Applications)中,不定型别是一种标签联合,用以表达任何一种资料型别(例如整数、双精度及单精度浮点数、物件等等),除了固定长度字串或结构体。任何在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