Тип варианта (COM) - Variant type (COM)
Вариант - это тип данных в некоторых языках программирования, особенно в Visual Basic , OCaml , Delphi и C ++ при использовании модели компонентных объектов . Это реализация одноименной концепции в области компьютерных наук .
В Visual Basic (и Visual Basic для приложений ) тип данных Variant представляет собой помеченное объединение, которое может использоваться для представления любого другого типа данных (например, целого числа , с плавающей запятой , одинарной и двойной точности, объекта и т. Д.) кроме строкового типа фиксированной длины. В Visual Basic любая переменная, не объявленная явно или тип которой не объявлен явно, рассматривается как вариант.
Хотя использование явно не объявленных вариантов не рекомендуется, они могут быть полезны, когда необходимый тип данных может быть известен только во время выполнения, когда ожидается, что тип данных будет изменяться, или когда желательны дополнительные параметры и массивы параметров. Фактически, языки с системой динамических типов часто имеют вариант как единственный доступный тип для переменных.
Среди основных изменений в Visual Basic .NET , поскольку это язык .NET, вариантный тип был заменен на объектный тип .NET . Есть общие черты в концепции, но также и существенные различия, и между этими двумя типами нет прямых преобразований. Для преобразований, которые могут потребоваться, если код Visual Basic .NET взаимодействует с COM-объектом Visual Basic 6, обычной методологией является использование маршалинга .NET .
Примеры
В 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 | Шестигранник | Тип пропварианта | Пропвариантный член | TypeName | Байты данных | Тип C и C ++ |
---|---|---|---|---|---|---|
0 | 0x00 | VT_EMPTY | Никто | Пустой 1 | ||
1 | 0x01 | VT_NULL | Никто | 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 вернет имя класса содержащегося объекта. Данные будут указателем на интерфейс , то есть указателем на указатель на таблицу виртуальных методов (которая представляет собой массив указателей на функции).
Общее использование
Коллекции
Collection
Класс в OLE Automation может хранить элементы разных типов данных. Поскольку тип данных этих элементов не может быть известен во время компиляции, методы добавления элементов и извлечения элементов из коллекции используют варианты. Если в Visual Basic используется For Each
конструкция, переменная итератора должна иметь объектный тип или вариант.
Вызов метода отправки
В OLE Automation IDispatch
интерфейс используется, когда класс объекта не может быть известен заранее. Следовательно, при вызове метода для такого объекта типы аргументов и возвращаемое значение неизвестны во время компиляции. Аргументы передаются в виде массива вариантов, и когда вызов завершается, возвращается вариант.
Необязательные параметры
В Visual Basic аргумент процедуры можно объявить необязательным, поставив перед ним Optional
ключевое слово. Если аргумент опущен, Visual Basic передает специальное значение в процедуру, названную Missing в приведенной выше таблице, что указывает на отсутствие аргумента. Поскольку значение может быть либо предоставленным значением, либо специальным значением, необходимо использовать вариант.
Function GetText(Optional ByVal Index) As String
If IsMissing(Index) Then
GetText = Item(CurrentItem)
Else
GetText = Item(Index)
End If
End Function
Точно так же ключевое слово ParamArray
можно использовать для передачи всех следующих аргументов в массиве вариантов.