#arrays #vba #default-value
#массивы #vba #значение по умолчанию
Вопрос:
Рассмотрим объявления
Dim x As Double
Dim avg(1 To 10) As Double
Каковы значения по умолчанию в x
и avg
?
В ходе тестирования я хочу сказать, что x
это инициализируется нулем. Аналогично, я хочу сказать, что все элементы в avg
были инициализированы нулем.
Однако могу ли я написать код, который зависит от этого? Или значения инициализации по умолчанию на самом деле не определены?
Ответ №1:
Если вы указываете тип данных, но не указываете инициализатор, Visual Basic инициализирует переменную значением по умолчанию для ее типа данных, которое для всех числовых типов равно 0 (нулю).
При запуске макроса все переменные инициализируются значением. Числовая переменная инициализируется нулем, строка переменной длины инициализируется строкой нулевой длины («»), а строка фиксированной длины заполняется кодом ASCII 0. Переменные варианта инициализируются как пустые. Пустая переменная представлена нулем в числовом контексте и строкой нулевой длины («») в строковом контексте.
Комментарии:
1. Уверен, что это правильно. Однако обратите внимание, что при использовании динамических массивов никакие элементы не инициализируются, а ссылка на arr(0) перед ее явной настройкой возвращает ошибку.
2. Кроме того, я почти уверен (путем поиска SO), что невозможно указать инициализатор при объявлении в Excel VBA, поскольку это .NET. Спасибо за ссылку! Это полностью рассеивает любые сомнения, которые
x
равны нулю. Хотя так ли это, что каждый элемент в фиксированном массиве также инициализируется нулем? На самом деле я уже обнаружил, что динамические массивы не инициализируются (только выделяются) при объявлении, и я просто хотел убедиться, что объявление фиксированных массивов не ведет себя одинаково.3. @Prashant, почему бы не добавить часы к переменной и проверить сами?
Ответ №2:
Вы можете написать код, который неявно зависит от значения по умолчанию для данного типа данных, но это не значит, что вы всегда должны это делать, потому что не так очевидно, что вы делаете, что может сбить с толку следующего человека, читающего ваш код (и этим человеком можете быть вы через год).
Вы не ошибетесь, если явно присвоите своим переменным начальное значение. Если вы хотите, вы можете сделать это в той же строке, что и объявление:
Dim x As Double: x = 0
Конечно, это немного сложнее для массивов, но обычно есть удобное место для их инициализации в вашем коде, где вы все равно их просматриваете.
Ответ №3:
Да, вы должны иметь возможность зависеть от того, какие типы чисел инициализируются в 0 в VBA, поскольку это их значение по умолчанию.
Однако, если это заставляет вас беспокоиться, а начальные значения так важны, то я рекомендую вам просто явно присвоить им значение 0 (хотя на самом деле вам это не нужно).