不定型別
此條目沒有列出任何參考或來源。 (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