簡介
在電腦程式中,不明確地宣告變數類型是一個不太好的習慣,但當一個數據的類型只有在運行時期才能被確定時,它就顯得相當的有用。實際上一部分動態類型的程式語言里,通常就只有不定類型這一種數據類型,即程式中沒有明確定義變數的數據類型。
在Visual Basic.NET里,因為面向對象概念被引入,所以不定類型被.NET的Object類型所取代。Object類型和不定類型在概念上很相似,但卻大大不同,而且無法互相轉換。當Visual Basic.NET需要與Visual Basic的COM對象互動,通常需要先透過.NET的一些程式進行轉換。
數據類型
數據的抽象結構的說明形式。同一類型的數據,其各成分都具有相同的特性,可進行相同的操作。程式中出現的每個變數、常量或表達式的值,都屬於確定的數據類型。變數的所有可能取值,以及在這些值上可允許的操作,都由數據的類型在程式中顯式地或隱式地規定。數據類型可分為簡單類型和複合類型兩種:
簡單類型,具有相同的數學特性和相同的計算機內部表示法,其數據的邏輯結構特點是只包含一個初等項的結點。通常有五種基本的簡單類型:整數類型、實數類型、布爾類型、字元類型和指針類型。
複合類型,或稱組合類型或結構類型。是由簡單類型用某種方式組合而成的。根據不同的構造方法,可構成以下不同的數據結構類型:
•數組類型。所有成分都屬於同一類型。
•記錄類型。各成分不一定屬於同一類型。
•集合類型。它定義的值集合是其基類型的冪集,也就是基類型的值域的所有子集的集合。
•檔案類型。屬於同一類型的各成分的一個序列,這個序列規定各成分的自然次序。
•遞歸數據結構。在數據結構的定義式中出現名本身的數據結構 。
示例
在Visual Basic,一個變數可以透過明確或含糊的宣告,令它成為一個不定類型的變數:
如果在 Delphi想要這樣做,則可使用如下的代碼:
格式
在Visual Basic中,一個不定類型需要使用16個位元組的空間去存儲數據;
偏移 | 大小 | 說明 |
0 | 2 | VarType,用以記錄此一不定型所存儲的數據類型。 |
2 | 6 | 空白,必須被設成0。 |
8 | 小於等於8 | 此一變數實際存儲的數據。 |
類型
以下為在Visual Basic中不定型可能會存儲的數據類型:
VarType | 數據類型 | C類型 | 類型名稱 |
0 | Empty | ||
1 | Null | ||
10 | 2A000A80 | HRESULT (長整數) | Error |
10 | 80020004 | HRESULT (長整數) | Missing |
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指針 | Nothing |
9 | xxxxxxxx | IUnknown指針 | 對象地址 |
註:
•Empty代表一個尚未被初始化的不定類型
•NULL代表資料庫里沒有數據的欄位。此NULL不應與未初始化的變數,或是C語言裡的NULL指針混淆。
•Missing一般用在調用函式時。當一個函式的參數被省略,那么就會傳入這個數值代替。
•Nothing代表此對象的參址被設為NULL。
•對象參址代表此變數是一個指向一個對象的界面的指針,也就是說它會指向該對象的函式指針表。
套用
集合
在OLE里,一個集合可以存放各種不同數據類型的數據。因為在編譯時期裡面所存儲的數據一般難以預測,所以集合里用來加入數據或讀取數據的函式一般都是使用不定類型。
可選參數
在Visual Basic,一個函式的參數可以使用Optional關鍵字,把它設成一個可選的參數。當使用這個函式時可選參數沒有被傳入,那么Visual Basic就會用一個叫Missing的特別數值取代被省略的參數。
有關術語
標籤聯合
標籤聯合(tagged union)也稱可辨識聯合(discriminated union)或者變體類型(variant type),指的是這樣的一種數據結構,它能夠存儲一組不同但是固定的類型中某個類型的對象,具體是哪個類型由標籤欄位決定。這種數據結構在解釋器、資料庫和數據通信中非常有用。需要注意的是,可辨識聯合英文原詞在數學中又指不相交並集(disjoint union)。
IUnknown
在程式設計中,IUnknown接口是組件對象模型(COM)中的基礎接口。COM規格中規定COM對象至少要實現此一接口,而且其他所有的COM接口都需要派生自IUnknown接口。IUnknown提供所有COM對象都支持的兩種基本特性:利用引用計數來進行對象生命周期管理,以及訪問許多事先定義的接口。
IUnknown接口會包括一個指向虛擬方法表的指針,虛擬方法表是一個有許多函式指針的列表,函式指針會指向許多實現IUnknown接口所宣告的函式,以和接口中宣告順序相同的方式排列。而進程內調用產生的開銷大致和C++中調用虛擬方法的開銷相近。