Тип варианта (COM)
Эта статья нуждается в дополнительных цитатах для проверки . ( май 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 .
Примеры
[ редактировать ]В Visual Basic вариант с именем A может быть объявлен явно или неявно:
Dim A
Dim A as Variant
В Delphi вариант с именем A объявляется следующим образом:
var A: variant;
Формат
[ редактировать ]Переменной типа варианта, для краткости называемой «вариантом», как определено в Visual Basic, требуется 16 байт памяти, и ее структура выглядит следующим образом:
Компенсировать | Размер | Описание |
---|---|---|
0 | 2 | Значение, возвращаемое VarType; указывает, какие данные содержит вариант. |
2 | 6 | Зарезервированные байты; используется только для типа VT_DECIMAL. |
8 | до 8 | Данные, которые содержит вариант. |
Типы
[ редактировать ]Ниже приведены несколько примеров вариантов, которые можно встретить в Visual Basic. В других языках могут использоваться и другие варианты.
ВарТип | Шестигранник | Пропвариантный тип | Пропвариантный член | ТипИмя | Байты данных | Тип C и C++ |
---|---|---|---|---|---|---|
0 | 0x00 | VT_EMPTY | Никто | Пустой 1 | ||
1 | 0x01 | VT_NULL | Никто | Нулевой 2 | ||
2 | 0x02 | VT_I2 | iVal | Целое число | 2А00 | КОРОТКИЙ |
3 | 0x03 | VT_I4 | лВал | Длинный | 2A000000 | ДЛИННЫЙ |
4 | 0x04 | VT_R4 | fltSelect | Одинокий | 00002842 | ПЛАВАТЬ |
5 | 0x05 | VT_R8 | дблВал | Двойной | 0000000000004540 | ДВОЙНОЙ |
6 | 0x06 | VT_CY | сивал | Валюта | А068060000000000 | Структура CY |
7 | 0x07 | VT_DATE | дата | Дата | 00000000C0D5E140 | ДАТА (двойная) |
8 | 0x08 | VT_BSTR | бстрвал | Нить | хххххххх | (BSTR):(OLECHAR *):(WCHAR *):( wchar_t *) |
9 | 0x09 | VT_DISPATCH | pdispVal | |||
10 | 0x0a | VT_ERROR | код | Ошибка | 2А000А80 | ЧРЕЗУЛЬТАТ (длинное целое число) |
11 | 0x0b | VT_BOOL | boolVal | логическое значение | ФФФФ | VARIANT_BOOL (короткий) |
12 | 0x0c | VT_VARIANT | pvarVal | Вариант | ВАРИАНТ | |
13 | 0x0d | VT_UNKNOWN | точкаВал | Ничего 4 | 00000000 | IНеизвестно * |
14 | 0x0e | VT_DECIMAL | деквал | ДЕСЯТИЧНАЯ | ||
16 | 0x10 | VT_I1 | cVal | Байт | ЧАР | |
17 | 0x11 | VT_UI1 | бвал | Байт | 2А | БАЙТ (беззнаковый символ) |
18 | 0x12 | VT_UI2 | уивал | СЛОВО (беззнаковое короткое) | ||
19 | 0x13 | VT_UI4 | УЛЬВАЛ | DWORD (беззнаковое целое) | ||
20 | 0x14 | VT_I8 | кит | |||
21 | 0x15 | VT_UI8 | ухВал | |||
22 | 0x16 | VT_INT | intSelect | |||
23 | 0x17 | VT_UINT | uintVal | |||
24 | 0x18 | VT_VOID | ||||
25 | 0x19 | VT_HRESULT | Отсутствующий 3 | 80020004 | ЧРЕЗУЛЬТАТ (длинное целое число) | |
26 | 0x1a | VT_PTR | ||||
27 | 0x1b | VT_SAFEARRAY | парировать | |||
28 | 0x1c | VT_CARRAY | ||||
29 | 0x1d | VT_USERDEFINED | ||||
30 | 0x1е | VT_LPSTR | с псз | |||
31 | 0x1f | VT_LPWSTR | pwszVal | |||
36 | 0x24 | VT_RECORD | ||||
37 | 0x25 | VT_INT_PTR | пинтувал | |||
38 | 0x26 | VT_UINT_PTR | пунтВал | |||
8192 | 0x2000 | VT_ARRAY | парировать | |||
9 | Ссылка на объект 5 | хххххххх | IНеизвестно * |
- 1 Тип неинициализированного варианта.
- 2 Тип значения NULL в базе данных, то есть не инициализированный и не эквивалентный нулевому указателю C++ .
- 3 Отсутствующие аргументы на самом деле представляют собой определенное значение ошибки под названием «параметр не найден».
- 4 Тип объекта имеет нулевую ссылку.
- 5 TypeName вернет имя класса содержащегося объекта. Данные будут указателем интерфейса , то есть указателем на указатель на таблицу виртуальных методов (которая представляет собой массив указателей функций).
Обычное использование
[ редактировать ]Коллекции
[ редактировать ]The Collection
Класс в OLE Automation может хранить элементы разных типов данных. Поскольку тип данных этих элементов не может быть известен во время компиляции, методы для добавления элементов в коллекцию и получения элементов из коллекции используют варианты. Если в Visual Basic For Each
используется конструкция, переменная итератора должна иметь тип объекта или его вариант.
Отправка вызовов методов
[ редактировать ]В OLE-автоматизации 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
может использоваться для передачи всех следующих аргументов в массиве вариантов.
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ «Глава 6. Варианты/Real World OCaml» . v1.realworldocaml.org . Архивировано из оригинала 8 мая 2019 г.