Вариант - это тип данных в определенных языках программирования, особенно Visual Basic, OCaml, Delphi и C ++ при использовании компонентной объектной модели.
в Visual Basic (и Visual Basic for Applications ) тип данных Variant - это помеченное объединение, которое может использоваться для представления любого другого типа данных (например, integer, с плавающей точкой, single - и double -precision, object и т. Д.), Кроме строкового типа фиксированной длины и типов record. В Visual Basic любая переменная, не объявленная явно или тип которой не объявлен явно, рассматривается как вариант.
Хотя использование явно не объявленных вариантов не рекомендуется, они могут быть полезны, когда необходимый тип данных может быть известен только во время выполнения, когда ожидается изменение типа данных или когда необязательные параметры и параметр массивы желательны. Фактически, языки с системой динамических типов часто имеют вариант как единственный доступный тип для переменных.
Среди основных изменений в Visual Basic.NET, являющемся языком.NET, вариантный тип был заменен типом объекта.NET. Между этими двумя типами есть сходство в концепции, но также и существенные различия, и между этими двумя типами не существует прямых преобразований. Для преобразований, которые могут потребоваться, если код Visual Basic.NET взаимодействует с COM-объектом Visual Basic 6, обычной методологией является использование сортировки.NET.
При несвязанном использовании вариантный тип также используется для ссылки на алгебраический тип данных (сопоставимый с помеченным объединением ), конструкторы которого часто называют вариантами. В таких языках, как OCaml и Haskell, этот тип вариантного типа является стандартным строительным блоком языка для представления многих структур данных.
В Visual Basic вариант с именем A может быть явно объявлен, как показано в любом из этих двух примеров:
Dim A Dim A as Variant
В Delphi вариант с именем A объявлен следующим образом:
var A: variant;
Переменная вариантного типа, для краткости называемая «вариантом», как определено в Visual Basic, требует хранения 16 байт, и ее структура выглядит следующим образом:
Смещение | Размер | Описание |
---|---|---|
0 | 2 | Значение, возвращаемое VarType; указывает, какие данные содержит вариант. |
2 | 6 | Зарезервированные байты; должен быть установлен на ноль. |
8 | до 8 | Данные, содержащиеся в варианте. |
Ниже приведены несколько примеров вариантов, которые можно встретить в Visual Basic. На других языках также могут использоваться другие варианты.
VarType | Hex | Propvariant Type | Propvariant Member | TypeName | Байты данных | C и Тип C ++ |
---|---|---|---|---|---|---|
0 | 0x00 | VT_EMPTY | Нет | Пусто | ||
1 | 0x01 | VT_NULL | Нет | Null | ||
2 | 0x02 | VT_I2 | iVal | Integer | 2A00 | SHORT |
3 | 0x03 | VT_I4 | lVal | Long | 2A000000 | LONG |
4 | 0x04 | VT_R4 | fltVal | Одинарный | 00002842 | FLOAT |
5 | 0x05 | VT_R8 | dblVal | Двойной | 0000000000004540 | ДВОЙНОЙ |
6 | 0x06 | VT_CY | cyVal | Валюта | A068060000000000 | Структура CY |
7 | 0x07 | VT_DATE | date | Date | 00000000C0D5E140 | DATE (double) |
8 | 0x08 | VT_BSTR | bstrVal | String | xxxxxxxx | (BSTR) :( OLECHAR *) :( WCHAR *) :( wchar_t *) |
9 | 0x09 | VT_DISPATCH | pdispVal | |||
10 | 0x0a | VT_ERROR | scode | Ошибка | 2A000A80 | HRESULT (long int) |
11 | 0x0b | VT_BOOL | boolVal | Boolean | FFFF | VARIANT_BOOL (короткий) |
12 | 0x0c | VT_VARIANT | pvarVal | Variant | VARIANT | |
13 | 0x0d | VT_UNKNOWN | punkVal | Ничего | 00000000 | IUnknown * |
14 | 0x0e | VT_DECIMAL | decVal | DECIMAL | ||
16 | 0x10 | VT_I1 | cVal | Байт | CHAR | |
17 | 0x11 | VT_UI1 | bVal | Байт | 2A | BYTE (символ без знака) |
18 | 0x12 | VT_UI2 | uiVal | WORD (беззнаковое короткое) | ||
19 | 0x13 | VT_UI4 | ulVal | DWORD (целое без знака) | ||
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 | Миссин g | 80020004 | HRESULT (long 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 | Ссылка на объект | xxxxxxxx | IUnknown * |
Класс Коллекция
в OLE Automation может хранить элементы с разными типами данных. Поскольку тип данных этих элементов не может быть известен во время компиляции, методы добавления элементов и извлечения элементов из коллекции используют варианты. Если в Visual Basic используется конструкция For Each
, переменная итератора должна иметь тип объекта или вариант.
В OLE Automation интерфейс IDispatch
используется, когда класс объекта не может быть известен заранее. Следовательно, при вызове метода для такого объекта типы аргументов и возвращаемое значение неизвестны во время компиляции. Аргументы передаются в виде массива вариантов, и когда вызов завершается, возвращается вариант.
В Visual Basic аргумент процедуры можно объявить необязательным, поставив перед ним ключевое слово Optional
. Если аргумент опущен, Visual Basic передает специальное значение в процедуру, названную Missing в приведенной выше таблице, что указывает на отсутствие аргумента. Поскольку значение может быть либо предоставленным значением, либо специальным значением, необходимо использовать вариант.
Функция GetText (необязательный индекс ByVal) как строка, если отсутствует (индекс), то GetText = элемент (CurrentItem), иначе GetText = элемент (индекс), конец, если конечная функция
Аналогично ключевое слово ParamArray
может быть используется для передачи всех следующих аргументов в массиве вариантов.