Typ wariantu (COM)
Variant to typ danych w niektórych językach programowania, w szczególności w Visual Basic , OCaml , Delphi i C++ , gdy używany jest Component Object Model . Jest to realizacja tytułowej koncepcji w informatyce .
W języku Visual Basic (i Visual Basic for Applications ) typ danych Variant jest związkiem oznaczonym , którego można użyć do reprezentowania dowolnego innego typu danych (na przykład liczby całkowitej , zmiennoprzecinkowej , pojedynczej i podwójnej precyzji, obiektu itp.) z wyjątkiem typu łańcuchowego o stałej długości. W Visual Basic każda zmienna, która nie została jawnie zadeklarowana lub której typ nie został jawnie zadeklarowany, jest traktowana jako wariant.
Chociaż nie zaleca się używania jawnie zadeklarowanych wariantów, mogą one być przydatne, gdy potrzebny typ danych może być znany tylko w czasie wykonywania, gdy oczekuje się, że typ danych będzie się zmieniał lub gdy pożądane są opcjonalne parametry i tablice parametrów. W rzeczywistości języki z dynamicznym systemem typów często mają wariant jako jedyny dostępny typ dla zmiennych.
Wśród głównych zmian w Visual Basic .NET , będącym językiem .NET, typ wariantu został zastąpiony typem obiektowym .NET . Istnieją podobieństwa w koncepcji, ale także znaczne różnice, a między tymi dwoma typami nie ma bezpośrednich konwersji. W przypadku konwersji, które mogą być potrzebne, jeśli kod Visual Basic .NET współdziała z obiektem Visual Basic 6 COM, normalną metodologią jest użycie organizowania platformy .NET .
Przykłady
W Visual Basic wariant o nazwie A można zadeklarować jawnie lub niejawnie:
Wym. A Wym. A jako wariant
W Delphi wariant o nazwie A jest deklarowany w następujący sposób:
var A : wariant ;
Format
Zmienna typu wariant, dla zwięzłości nazywana „wariantem”, zgodnie z definicją w Visual Basic, potrzebuje 16 bajtów pamięci, a jej układ jest następujący:
Zrównoważyć | Rozmiar | Opis |
---|---|---|
0 | 2 | Wartość zwrócona przez VarType; określa, jakie dane zawiera wariant. |
2 | 6 | Zarezerwowane bajty; używany tylko dla typu VT_DECIMAL. |
8 | do 8 | Dane, które zawiera wariant. |
typy
Oto kilka przykładów wariantów, które można napotkać w Visual Basic. W innych językach można również stosować inne rodzaje wariantów.
VarType | Klątwa | Właściwy typ | Członek prowizoryczny | Wpisz imię | Bajty danych | typu C i C++ |
---|---|---|---|---|---|---|
0 | 0x00 | VT_EMPTY | Nic | Pusty 1 | ||
1 | 0x01 | VT_NULL | Nic | Zerowy 2 | ||
2 | 0x02 | VT_I2 | iVal | Liczba całkowita | 2A00 | KRÓTKI |
3 | 0x03 | VT_I4 | lWart | Długi | 2A000000 | DŁUGI |
4 | 0x04 | VT_R4 | fltVal | Pojedynczy | 00002842 | PLATFORMA |
5 | 0x05 | VT_R8 | dblVal | Podwójnie | 0000000000004540 | PODWÓJNIE |
6 | 0x06 | VT_CY | cyVal | Waluta | A068060000000000 | Struktura CY |
7 | 0x07 | VT_DATE | data | Data | 00000000C0D5E140 | DATA (podwójna) |
8 | 0x08 | VT_BSTR | bstrVal | Strunowy | xxxxxxxxx | (BSTR):(OLECHAR *):(WCHAR *):( wchar_t *) |
9 | 0x09 | VT_DISPATCH | pdispVal | |||
10 | 0x0a | VT_ERROR | kod | Błąd | 2A000A80 | HWYNIK (long int) |
11 | 0x0b | VT_BOOL | boolVal | logiczne | FFFF | VARIANT_BOOL (krótka) |
12 | 0x0c | VT_VARIANT | pvarVal | Wariant | WARIANT | |
13 | 0x0d | VT_UNKNOWN | punkVal | nic 4 | 00000000 | INieznany * |
14 | 0x0e | VT_DECIMAL | wartość dziesiętna | DZIESIĘTNY | ||
16 | 0x10 | VT_I1 | cVal | Bajt | ZWĘGLAĆ | |
17 | 0x11 | VT_UI1 | bVal | Bajt | 2A | BYTE (znak bez znaku) |
18 | 0x12 | VT_UI2 | uiVal | SŁOWO (krótkie bez znaku) | ||
19 | 0x13 | VT_UI4 | ulWart | DWORD (int bez znaku) | ||
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 | brak 3 | 80020004 | HWYNIK (long int) | |
26 | 0x1a | VT_PTR | ||||
27 | 0x1b | VT_SAFEARRAY | parować | |||
28 | 0x1c | VT_CARRAY | ||||
29 | 0x1d | VT_USERDEFINED | ||||
30 | 0x1e | VT_LPSTR | pszVal | |||
31 | 0x1f | VT_LPWSTR | pwszVal | |||
36 | 0x24 | VT_REKORD | ||||
37 | 0x25 | VT_INT_PTR | kufelVal | |||
38 | 0x26 | VT_UINT_PTR | puintVal | |||
8192 | 0x2000 | VT_ARRAY | parować | |||
9 | Odniesienie do obiektu 5 | xxxxxxxxx | INieznany * |
- 1 Typ niezainicjowanego wariantu.
- 2 Typ wartości NULL w bazie danych, czyli nie jest niezainicjowany ani nie jest odpowiednikiem pustego wskaźnika C++ .
- 3 Brakujące argumenty to w rzeczywistości konkretna wartość błędu zatytułowana „nie znaleziono parametru”.
- 4 Typ obiektu ustawiony na odwołanie o wartości null.
- 5 TypeName zwróci nazwę klasy zawartego obiektu. Dane byłyby interfejsu , czyli wskaźnikiem do wskaźnika do wirtualnej tabeli metod (która jest tablicą wskaźników funkcji).
Typowe zastosowania
Kolekcje
Klasa Collection
w OLE Automation może przechowywać elementy różnych typów danych. Ponieważ typ danych tych elementów nie może być znany w czasie kompilacji, metody dodawania elementów do i pobierania elementów z kolekcji wykorzystują warianty. Jeśli w języku Visual Basic For Each
, zmienna iteratora musi być typu obiektowego lub wariantu.
Wywołania metody wysyłki
W OLE Automation interfejs IDispatch
jest używany, gdy nie można z góry poznać klasy obiektu. Dlatego podczas wywoływania metody na takim obiekcie typy argumentów i zwracana wartość nie są znane w czasie kompilacji. Argumenty są przekazywane jako tablica wariantów, a po zakończeniu wywołania zwracany jest wariant.
Opcjonalne parametry
W języku Visual Basic argument procedury można zadeklarować jako opcjonalny, poprzedzając go słowem kluczowym Opcjonalnie
. Gdy argument zostanie pominięty, Visual Basic przekazuje do procedury specjalną wartość, zwaną Missing , wskazującą, że brakuje argumentu. Ponieważ wartość może być wartością dostarczoną lub wartością specjalną, należy użyć wariantu.
Funkcja GetText ( opcjonalnie ByVal Index ) jako String If IsMissing ( indeks ) Then GetText = Item ( CurrentItem ) Else GetText = Item ( indeks ) End If End Funkcja
Podobnie słowo kluczowe ParamArray
może być użyte do przekazania wszystkich kolejnych argumentów w tablicy wariantów.
Zobacz też
Linki zewnętrzne
- C++ Boost.Variant
- https://msdn.microsoft.com/en-ca/library/cc237865.aspx
- https://msdn.microsoft.com/en-us/library/windows/desktop/aa380072(v=vs.85).aspx