В VBA все переменные начинаются как вариантный тип
Процитирую моего коллегу:
все переменные в VBA являются вариантами, но с другим типом:
Dim x '--->variant with vartype = vbEmpty x= "hello" '--->vartype changed from vbEmpty to vbString and value assigned x= 1 '--->vartype changed to vbInteger
Dim x as String '--->variant with vartype = vbEmpty is created and then vartype changed to vbString x= "hello" '--->vartype = vbString x=1 '--->because x was declared explicitly with String it will try to implicitly convert 1 to string, so, x will remain vbString
Мой главный спор заключается в том, как можно Dim x as String
вписывается в его заявление о том, что all variables in VBA are variants
, Варианты более неэффективны для работы, поэтому с чего бы все началось и конвертировалось.
Все переменные, в VBA, вариант?
Может ли кто-нибудь найти какую-либо документацию или предоставить код, который категорически так или иначе подтверждает ответ?
РЕДАКТИРОВАТЬ
Он выдвинул следующее в качестве начала, чтобы попытаться доказать вышеизложенное, но я думаю, что все это доказывает, что все они являются строками:
Sub aaa()
Dim str_str As String
Dim str_var
str_str = "aaa"
str_var = "aaa"
str_xxx = "aaa"
MsgBox VarType(str_str) & ": " & TypeName(str_str)
MsgBox VarType(str_var) & ": " & TypeName(str_var)
MsgBox VarType(str_xxx) & ": " & TypeName(str_xxx)
End Sub
3 ответа
Используя Debug и окно Locals, вы можете продемонстрировать, что то, что говорит ваш коллега, неверно:
Dim as string создает строковый тип, но Dim as Variant и назначение строки дает вам вариант с подтипом string
Нет, не все переменные являются Variant. Варианты и строки имеют разные размеры хранилища; эта память выделяется в зависимости от типа данных в Dim
заявление. Один не просто волшебным образом превращается в другого.
Посмотрите "Сводка типов данных" в файле справки VBA. Или посмотрите здесь: http://msdn.microsoft.com/en-us/library/aa263420%28v=vs.60%29.aspx
'---> вариант с vartype = vbEmpty создается, а затем vartype изменяется на vbString
Откуда у твоего коллеги такая идея?! Там нет абсолютно никаких доказательств этого. В документации конкретно говорится: "Когда переменные инициализируются [...], строка переменной длины инициализируется в строку нулевой длины ("")", а не vbEmpty
,
Источником его путаницы может быть то, что
Dim x
по умолчанию такой же, как
Dim x as Variant
но он наверное догадался (ошибочно) что когда пишешь Dim x As String
, Dim x
интерпретируется сначала, создавая вариант, затем As String
входит, превращая его в строку. Это просто неверно. As String
является частью Dim
заявление, и все утверждение интерпретируется сразу.
Строго говоря, я не думаю, что можно найти какую-либо документацию, в которой конкретно сказано:Dim x As String
сначалане создайте вариант, а затем измените его на строку ". Но на самом деле ваш коллега обязан представить доказательства своих необычных заявлений. Он может смотреть весь день, он не найдет их.
Ради полноты (как дополнение к вышесказанному):
Возможно, ваш друг говорит об этом (пример внизу):
http://office.microsoft.com/en-001/access-help/vartype-function-HA001228932.aspx
Это функция VBA и не более чем полезный инструмент, если вы хотите использовать динамическое приведение типов.
В случае, если вы используете только динамическую типизацию и применяете пример по ссылке "всегда" (плохая практика в VBA), тогда все ваши переменные начинаются как варианты (крайне не рекомендуется).
Возможно, он путает статическую типизацию VBA с языком программирования, таким как Javascript, который не использует статическую типизацию; JS делает неявные преобразования типов: var i = 0 ~> неявно типизируется как число во время выполнения JS.
Примечание: хотя статическая типизация рекомендуется в VBA, на самом деле существуют случаи, когда программисты VBA используют динамическую типизацию (в случае, если тип переменной неизвестен до времени выполнения).