Тип варианта - Википедия - Variant type
Эта статья нужны дополнительные цитаты для проверка.Май 2019) (Узнайте, как и когда удалить этот шаблон сообщения) ( |
Вариант это тип данных в некоторых языках программирования, особенно Visual Basic, OCaml,[1] Delphi и C ++ при использовании Компонентная объектная модель.
В Visual Basic (и Visual Basic для приложений ) тип данных Variant - это помеченный союз который можно использовать для представления любого другого типа данных (например, целое число, плавающая точка, Один - и двойной -точность, объект и т. д.), кроме строкового типа фиксированной длины и записывать типы. В Visual Basic любая переменная, не объявленная явно или тип которой не объявлен явно, считается вариантом.
Хотя использование явно не объявленных вариантов не рекомендуется, они могут быть полезны, когда необходимый тип данных может быть известен только во время выполнения, когда ожидается, что тип данных будет изменяться, или когда требуются дополнительные параметры и массивы параметров. Фактически, языки с система динамического типа часто есть вариант как Только доступный тип для переменных.
Среди основных изменений в Visual Basic .NET, будучи языком .NET, вариантный тип был заменен на .NET объект тип. Между этими двумя типами есть сходство в концепции, но также и существенные различия, и между этими двумя типами не существует прямых преобразований. Для преобразований, которые могут потребоваться, если код Visual Basic .NET взаимодействует с COM-объектом Visual Basic 6, обычной методологией является использование Маршаллинг .NET.
В несвязанном использовании, тип варианта также используется для обозначения алгебраический тип данных (сравнимо с помеченный союз ), конструкторы которых часто называют варианты. На таких языках, как OCaml и Haskell, этот вариантный тип является стандартным строительным блоком языка для представления многих структур данных.
Примеры
В Visual Basic вариант с именем A может быть явно объявлен, как показано в любом из этих двух примеров:
Тусклый АТусклый А в качестве Вариант
В Delphi, вариант с именем A объявляется следующим образом:
вар А: вариант;
Формат
Переменная типа вариант, для краткости называемая «вариантом», как определено в Visual Basic, требует хранения 16 байтов, и ее структура выглядит следующим образом:
Компенсировать | Размер | Описание |
---|---|---|
0 | 2 | Значение, возвращаемое VarType; указывает, какие данные содержит вариант. |
2 | 6 | Зарезервированные байты; должен быть установлен на ноль. |
8 | до 8 | Данные, содержащиеся в варианте. |
Типы
Ниже приведены несколько примеров вариантов, которые можно встретить в Visual Basic. На других языках также могут использоваться другие варианты.
VarType | Hex | Тип пропварианта | Пропвариантный член | TypeName | Байты данных | Тип C и C ++ |
---|---|---|---|---|---|---|
0 | 0x00 | VT_EMPTY | Никто | Пустой1 | ||
1 | 0x01 | VT_NULL | Никто | Ноль2 | ||
2 | 0x02 | VT_I2 | iVal | Целое число | 2A00 | КОРОТКАЯ |
3 | 0x03 | VT_I4 | lVal | Длинный | 2A000000 | ДЛИННЫЙ |
4 | 0x04 | VT_R4 | fltVal | Одинокий | 00002842 | ПЛАВАТЬ |
5 | 0x05 | VT_R8 | dblVal | Двойной | 0000000000004540 | ДВОЙНОЙ |
6 | 0x06 | VT_CY | cyVal | Валюта | A068060000000000 | Структура CY |
7 | 0x07 | VT_DATE | Дата | Дата | 00000000C0D5E140 | ДАТА (двойная) |
8 | 0x08 | VT_BSTR | bstrVal | Нить | xxxxxxxx | (BSTR) :( OLECHAR *) :( WCHAR *) :(wchar_t *) |
9 | 0x09 | VT_DISPATCH | pdispVal | |||
10 | 0x0a | VT_ERROR | скод | Ошибка | 2A000A80 | HRESULT (длинное целое) |
11 | 0x0b | VT_BOOL | boolVal | Булево | FFFF | VARIANT_BOOL (короткий) |
12 | 0x0c | VT_VARIANT | pvarVal | Вариант | ВАРИАНТ | |
13 | 0x0d | VT_UNKNOWN | punkVal | Ничего4 | 00000000 | IНеизвестно * |
14 | 0x0e | VT_DECIMAL | decVal | ДЕСЯТИЧНЫЙ | ||
16 | 0x10 | VT_I1 | cVal | Байт | СИМВОЛ | |
17 | 0x11 | VT_UI1 | bVal | Байт | 2А | БАЙТ (символ без знака) |
18 | 0x12 | VT_UI2 | uiVal | СЛОВО (беззнаковое короткое) | ||
19 | 0x13 | VT_UI4 | ulVal | DWORD (целое без знака) | ||
20 | 0x14 | VT_I8 | hVal | |||
21 | 0x15 | VT_UI8 | ухвал | |||
22 | 0x16 | VT_INT | intVal | |||
23 | 0x17 | VT_UINT | uintVal | |||
24 | 0x18 | VT_VOID | ||||
25 | 0x19 | VT_HRESULT | Отсутствующий3 | 80020004 | HRESULT (длинное целое) | |
26 | 0x1a | VT_PTR | ||||
27 | 0x1b | VT_SAFEARRAY | парить | |||
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 | парить | |||
9 | Ссылка на объект5 | xxxxxxxx | IНеизвестно * |
- 1 Тип неинициализированного варианта.
- 2 Тип значения NULL в базе данных, то есть не неинициализированный и не эквивалентный C ++ нулевой указатель.
- 3 Отсутствующие аргументы на самом деле представляют собой конкретное значение ошибки с названием «параметр не найден».
- 4 Тип объекта установлен на пустую ссылку.
- 5 TypeName вернет имя класса содержащегося объекта. Данные будут интерфейс указатель, то есть указатель на указатель на таблица виртуальных методов (который представляет собой массив указателей на функции).
Общее использование
Коллекции
В Коллекция
класс в OLE автоматизация может хранить элементы разных типов данных. Поскольку тип данных этих элементов не может быть известен во время компиляции, методы добавления элементов и извлечения элементов из коллекции используют варианты. Если в Visual Basic Для каждого
используется конструкция, переменная итератора должна быть объектного типа или варианта.
Вызов методов отправки
В OLE Automation IDispatch
interface используется, когда класс объекта не может быть известен заранее. Следовательно, при вызове метода для такого объекта типы аргументов и возвращаемое значение неизвестны во время компиляции. Аргументы передаются в виде массива вариантов, и когда вызов завершается, возвращается вариант.
Необязательные параметры
В Visual Basic аргумент процедуры можно объявить необязательным, поставив перед ним префикс Необязательный
ключевое слово. Если аргумент опущен, Visual Basic передает специальное значение в процедуру, называемую Отсутствующий в таблице выше, что указывает на отсутствие аргумента. Поскольку значение может быть либо предоставленным значением, либо специальным значением, необходимо использовать вариант.
Функция GetText(Необязательный ByVal Индекс) В качестве Нить Если Пропал, отсутствует(Индекс) потом GetText = Элемент(CurrentItem) Еще GetText = Элемент(Индекс) Конец ЕслиКонец Функция
Аналогично ключевое слово ParamArray
может использоваться для передачи всех следующих аргументов в массиве вариантов.