Változat típusa (COM) - Variant type (COM)
Variant egy adattípus egyes programozási nyelvek, különösen a Visual Basic , OCaml , Delphi és C ++ , ha a Component Object Model . Ez a névadó koncepció megvalósítása a számítástechnikában .
A Visual Basic (és a Visual Basic for Applications ) rendszerben a Variant adattípus egy címkézett unió , amely bármely más adattípus (például egész szám , lebegőpontos , egyszeres és kettős pontosság, objektum stb.) Ábrázolására használható . rögzített hosszúságú karakterlánc típus kivételével. A Visual Basicben minden olyan változó, amelyet nem kifejezetten deklaráltak, vagy amelynek típusa nincs kifejezetten deklarálva, egy változat.
Bár nem kifejezetten nem deklarált változatok használata nem ajánlott, azok akkor lehetnek hasznosak, ha a szükséges adattípus csak futásidőben ismerhető meg, ha az adattípus várhatóan változik, vagy ha opcionális paramétereket és paraméter tömböket kívánnak. Sőt, a nyelvek egy dinamikus típusú rendszer gyakran variáns, mint a csak álló típusú változók.
A Visual Basic .NET fő változásai között , mivel .NET nyelv, a változat típusát felváltotta a .NET objektumtípus . A koncepcióban vannak hasonlóságok, de jelentős különbségek is, és e két típus között nincs közvetlen konverzió. A konverziókhoz - ha a Visual Basic .NET kód interakcióba lép a Visual Basic 6 COM objektummal - a normál módszertan a .NET felosztás használata .
Példák
A Visual Basicben az A nevű változat kifejezetten vagy implicit módon deklarálható:
Dim A
Dim A as Variant
A Delphi -ben az A nevű változatot a következő módon deklarálják:
var A: variant;
Formátum
A Variant típusú változónak, a rövidség kedvéért "változatnak" nevezve, ahogy azt a Visual Basic meghatározza, 16 bájtos tárhelyre van szüksége, és elrendezése a következő:
| Eltolás | Méret | Leírás |
|---|---|---|
| 0 | 2 | A VarType által visszaadott érték; megadja, hogy a változat milyen adatokat tartalmaz. |
| 2 | 6 | Foglalt bájtok; nullára kell állítani. |
| 8 | akár 8 | A változat által tartalmazott adatok. |
Típusok
Következzen néhány példa a Visual Basic programban megtalálható változatokra. Más nyelveken más változatok is használhatók.
| VarType | Hex | Propvariáns típus | Támogató tag | TypeName | Adatbájtok | C és C ++ típusú |
|---|---|---|---|---|---|---|
| 0 | 0x00 | VT_EMPTY | Egyik sem | Üres 1 | ||
| 1 | 0x01 | VT_NULL | Egyik sem | Null 2 | ||
| 2 | 0x02 | VT_I2 | iVal | Egész szám | 2A00 | RÖVID |
| 3 | 0x03 | VT_I4 | lVal | Hosszú | 2A000000 | HOSSZÚ |
| 4 | 0x04 | VT_R4 | fltVal | Egyetlen | 00002842 | ÚSZÓ |
| 5 | 0x05 | VT_R8 | dblVal | Kettős | 0000000000004540 | KETTŐS |
| 6 | 0x06 | VT_CY | cyVal | Valuta | A068060000000000 | CY szerkezet |
| 7 | 0x07 | VT_DATE | dátum | Dátum | 00000000C0D5E140 | DATE (dupla) |
| 8 | 0x08 | VT_BSTR | bstrVal | Húr | xxxxxxxx | (BSTR) :( OLECHAR *) :( WCHAR *) :( wchar_t *) |
| 9 | 0x09 | VT_DISPATCH | pdispVal | |||
| 10 | 0x0a | VT_ERROR | pásztázott | Hiba | 2A000A80 | HRESULT (hosszú int) |
| 11 | 0x0b | VT_BOOL | boolVal | Boolean | FFFF | VARIANT_BOOL (rövid) |
| 12 | 0x0c | VT_VÁLTOZAT | pvarVal | Változat | VÁLTOZAT | |
| 13 | 0x0d | VT_UNKNOWN | punkVal | Semmi 4 | 00000000 | Ismeretlen * |
| 14 | 0x0e | VT_DECIMAL | decVal | DECIMÁLIS | ||
| 16 | 0x10 | VT_I1 | cVal | Byte | CHAR | |
| 17 | 0x11 | VT_UI1 | bVal | Byte | 2A | BYTE (előjel nélküli karakter) |
| 18 | 0x12 | VT_UI2 | uiVal | WORD (rövid előjel nélkül) | ||
| 19 | 0x13 | VT_UI4 | ulVal | DWORD (előjel nélküli int) | ||
| 20 | 0x14 | VT_I8 | hVal | |||
| 21 | 0x15 | VT_UI8 | uhVal | |||
| 22 | 0x16 | VT_INT | intVal | |||
| 23 | 0x17 | VT_UINT | uintVal | |||
| 24 | 0x18 | VT_VOID | ||||
| 25 | 0x19 | VT_HRESULT | Hiányzik 3 | 80020004 | HRESULT (hosszú int) | |
| 26 | 0x1a | VT_PTR | ||||
| 27 | 0x1b | VT_SAFEARRAY | parray | |||
| 28 | 0x1c | VT_CARRAY | ||||
| 29 | 0x1d | VT_USERDEFINED | ||||
| 30 | 0x1e | VT_LPSTR | pszVal | |||
| 31 | 0x1f | VT_LPWSTR | pwszVal | |||
| 36 | 0x24 | VT_RECORD | ||||
| 37 | 0x25 | VT_INT_PTR | pintVal | |||
| 38 | 0x26 | VT_UINT_PTR | puintVal | |||
| 8192 | 0x2000 | VT_ARRAY | parray | |||
| 9 | Tárgy hivatkozás 5 | xxxxxxxx | Ismeretlen * |
- 1 Az inicializálatlan változat típusa.
- 2 Az adatbázis NULL értékének típusa, azaz nem inicializálatlan, és nem egyenértékű a C ++ nullmutatóval .
- 3 A hiányzó argumentumok valójában egy adott hibaérték "paraméter nem található" címmel.
- 4 Az objektumtípus null hivatkozásra van állítva.
- 5 A TypeName a megadott objektum osztályának nevét adja vissza. Az adatok egy interfész -mutató, azaz egy mutató mutatója egy virtuális metódustáblára (amely egy függvénymutató tömb).
Gyakori felhasználások
Gyűjtemények
Az OLE AutomationCollection osztálya különböző adattípusokat képes tárolni. Mivel ezeknek az elemeknek az adattípusa nem ismert a fordítás idején, az elemek gyűjteményhez való hozzáadásának és lekérésének módszerei változatokat használnak. Ha a Visual Basicben a konstrukciót használják, az iterátor változónak objektumtípusnak vagy változatnak kell lennie.
For Each
Feladási módszer hívások
Az OLE Automationben az IDispatchinterfészt akkor használják, ha egy objektum osztályát nem lehet előre tudni. Ezért amikor metódust hívunk egy ilyen objektumon, az argumentumok típusai és a visszatérési érték nem ismertek a fordítás idején. Az argumentumok változatok tömbjeként kerülnek átadásra, és amikor a hívás befejeződik, egy változatot ad vissza.
Opcionális paraméterek
A Visual Basicben az eljárás argumentumot választhatónak nyilváníthatjuk, ha azt a Optionalkulcsszóval előtaggal látjuk el . Ha az argumentum elhagyható Visual Basic átmegy a különleges értéket eljárással, az úgynevezett Hiányzik a fenti táblázatban, jelezve, hogy az érvelés hiányzik. Mivel az érték lehet egy megadott érték vagy egy speciális érték, egy változatot kell használni.
Function GetText(Optional ByVal Index) As String
If IsMissing(Index) Then
GetText = Item(CurrentItem)
Else
GetText = Item(Index)
End If
End Function
Hasonlóképpen a kulcsszó ParamArrayhasználható az összes következő argumentum átadására egy variáns tömbben.