Тип варианта

редактировать

Вариант - это тип данных в определенных языках программирования, особенно 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, этот тип вариантного типа является стандартным строительным блоком языка для представления многих структур данных.

Содержание

  • 1 Примеры
    • 1.1 Формат
    • 1.2 Типы
  • 2 Распространенное использование
    • 2.1 Коллекции
    • 2.2 Вызов методов отправки
    • 2.3 Необязательные параметры
  • 3 См. Также
  • 4 Ссылки
  • 5 Внешние ссылки

Примеры

В Visual Basic вариант с именем A может быть явно объявлен, как показано в любом из этих двух примеров:

Dim A Dim A as Variant

В Delphi вариант с именем A объявлен следующим образом:

var A: variant;

Формат

Переменная вариантного типа, для краткости называемая «вариантом», как определено в Visual Basic, требует хранения 16 байт, и ее структура выглядит следующим образом:

СмещениеРазмерОписание
02Значение, возвращаемое VarType; указывает, какие данные содержит вариант.
26Зарезервированные байты; должен быть установлен на ноль.
8до 8Данные, содержащиеся в варианте.

Типы

Ниже приведены несколько примеров вариантов, которые можно встретить в Visual Basic. На других языках также могут использоваться другие варианты.

VarTypeHexPropvariant TypePropvariant MemberTypeNameБайты данныхC и Тип C ++
00x00VT_EMPTYНетПусто
10x01VT_NULLНетNull
20x02VT_I2iValInteger2A00SHORT
30x03VT_I4lValLong2A000000LONG
40x04VT_R4fltValОдинарный00002842FLOAT
50x05VT_R8dblValДвойной0000000000004540ДВОЙНОЙ
60x06VT_CYcyValВалютаA068060000000000Структура CY
70x07VT_DATEdateDate00000000C0D5E140DATE (double)
80x08VT_BSTRbstrValStringxxxxxxxx(BSTR) :( OLECHAR *) :( WCHAR *) :( wchar_t *)
90x09VT_DISPATCHpdispVal
100x0aVT_ERRORscodeОшибка2A000A80HRESULT (long int)
110x0bVT_BOOLboolValBooleanFFFFVARIANT_BOOL (короткий)
120x0cVT_VARIANTpvarValVariantVARIANT
130x0dVT_UNKNOWNpunkValНичего00000000IUnknown *
140x0eVT_DECIMALdecValDECIMAL
160x10VT_I1cValБайтCHAR
170x11VT_UI1bValБайт2ABYTE (символ без знака)
180x12VT_UI2uiValWORD (беззнаковое короткое)
190x13VT_UI4ulValDWORD (целое без знака)
200x14VT_I8hVal
210x15VT_UI8uhVal
220x16VT_INTintVal
230x17VT_UINTuintVal
240x18VT_VOID
250x19VT_HRESULTМиссин g80020004HRESULT (long int)
260x1aVT_PTR
270x1bVT_SAFEARRAYparray
280x1cVT_CARRAY
290x1dVT_USERDEFINED
300x1eVT_LPSTRpszVal
310x1fVT_LPWSTRpwszVal
360x24VT_RECORD
370x25VT_INT_PTRpintVal
380x26VT_UINT_PTRpuintVal
81920x2000VT_ARRAYparray
9Ссылка на объектxxxxxxxxIUnknown *
  • Тип неинициализированного варианта.
  • Тип значения NULL в базе данных, то есть не неинициализированный и не эквивалентный C ++ нулевой указатель.
  • Отсутствующие аргументы на самом деле являются конкретным значением ошибки под названием «параметр не найден».
  • Тип объекта установлен на пустую ссылку.
  • TypeName вернетимя класса содержащегося объекта. Данные будут представлять собой указатель на интерфейс , то есть указатель на указатель на таблицу виртуальных методов (которая представляет собой массив указателей на функции).

Обычное использование

Коллекции

Класс Коллекцияв OLE Automation может хранить элементы с разными типами данных. Поскольку тип данных этих элементов не может быть известен во время компиляции, методы добавления элементов и извлечения элементов из коллекции используют варианты. Если в Visual Basic используется конструкция For Each, переменная итератора должна иметь тип объекта или вариант.

Вызов метода отправки

В OLE Automation интерфейс IDispatch используется, когда класс объекта не может быть известен заранее. Следовательно, при вызове метода для такого объекта типы аргументов и возвращаемое значение неизвестны во время компиляции. Аргументы передаются в виде массива вариантов, и когда вызов завершается, возвращается вариант.

Необязательные параметры

В Visual Basic аргумент процедуры можно объявить необязательным, поставив перед ним ключевое слово Optional. Если аргумент опущен, Visual Basic передает специальное значение в процедуру, названную Missing в приведенной выше таблице, что указывает на отсутствие аргумента. Поскольку значение может быть либо предоставленным значением, либо специальным значением, необходимо использовать вариант.

Функция GetText (необязательный индекс ByVal) как строка, если отсутствует (индекс), то GetText = элемент (CurrentItem), иначе GetText = элемент (индекс), конец, если конечная функция

Аналогично ключевое слово ParamArrayможет быть используется для передачи всех следующих аргументов в массиве вариантов.

См. Также

Ссылки

Внешние ссылки

Последняя правка сделана 2021-06-18 09:53:17
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте