不定型別

不定型別是目前程式語言中所擁有的一種資料型別,常用於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