Преобразование типов значений Null и Unassigned типа Variant в Delphi

Конвертация Unassigned

Если переменная с типом Variant не инициализирована то она имеет значение Unassigned, даже если это поле класса:

При преобразовании Unassigned в другие типы возможны следующие случаи:

Значение Unassigned нужно иметь в виду при работе с Variant. Но с практической точки зрения более интересно поведение в случае значения null. Например, он часто встречается при получении значения из поля датасета (TField) через свойство Value.

Конвертация Null

Конвертация null зависит от значения логической глобальной переменной System.Variants.NullStrictConvert. Её значение по умолчанию равно True и при попытке конвертации null появляется исключение EVariantTypeCastError. Если же значение NullStrictConvert равно False, то по умолчанию null преобразуется аналогично Unassigned.

Есть особенность для типа String. Можно задать какой строке будет равен null. Например

Выражения

Если null участвует в выражении то результат выражения будет null.

Ситуация с Unassigned интереснее. Вероятно, срабатывает такое же преобразование как при конвертации, в данном примере к 0. Описания в документации нет.

Сравнения

Поведение null при сравнении зависит от глобальных переменных NullEqualityRule и NullMagnitudeRule.

NullEqualityRule определяет результат операторов "=" и "<>" (равно и не равно). У этой переменной возможны три значения

  • ncrError — сравнение с null вызывает исключение
  • ncrStrict — результат сравнение с null всегда равен False
  • ncrLoose (по умолчанию) — null равен другому null и не равен другим значениям

NullMagnitudeRule определяет результат операторов "<" и ">" (больше и меньше). Значения этой переменной аналогичны NullEqualityRule

  • ncrError — сравнение с null вызывает исключение
  • ncrStrict — результат сравнение с null всегда равен False
  • ncrLoose (по умолчанию) — null считается меньше любого другого значения

Интересный случай сравнения null с null

Выводы

  • Переменные типа Variant нужно всегда инициализировать, даже если они являются переменным класса, чтобы не сталкиваться с Unassigned.
  • Во всех случаях при работе с Variant нужно учитывать null.
  • Менять или не менять значение по умолчанию переменной NullStrictConvert вопрос открытый.

Ссылки

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *