В чем разница между операторами VBScript + и &?

На каждом сайте, который говорит о VBScript, оператор '&' указан как оператор конкатенации строк. Однако в некотором коде, который я недавно унаследовал, я вижу, что используется оператор '+', и в результате этого я не вижу никаких ошибок. Является ли это приемлемой альтернативой?


person Jeremy Cron    schedule 30.07.2009    source источник


Ответы (4)


Оператор + перегружен, а оператор & — нет. Оператор & выполняет только конкатенацию строк. В некоторых кругах рекомендуется использовать оператор &, поскольку он однозначен и, следовательно, не может иметь непреднамеренных эффектов в результате перегрузки.

person Robert Harvey    schedule 30.07.2009
comment
The + operator is overloaded -- перегружен в каком смысле? - person Wolf; 08.12.2016
comment
@wolf в VB оператор + может выполнять как сложение, так и конкатенацию, в зависимости от контекста. - person Robert Harvey; 08.12.2016
comment
Ну это я уже читал. Я обнаружил, что само слово overloaded настолько перегружено, что мне хотелось, чтобы ответ мог быть немного более точным в этом пункте. - person Wolf; 09.12.2016

Оператор & выполняет конкатенацию строк, то есть принудительно преобразует операнды в строки (например, сначала вызывая для них CStr). +, в свою очередь, принудительно добавляет, если одно из выражений является числовым. Например:

1 & 2

дает вам 12, тогда как

1 + 2
"1" + 2
1 + "2"

дать вам 3.

Таким образом, рекомендуется использовать & для объединения строк, поскольку это устраняет неоднозначность.

person Helen    schedule 30.07.2009
comment
+1 за указание номера строки + номер. В принятом ответе не упоминается преобразование vbscript числовых строк в числа. - person baacke; 21.01.2014

Оператор + может иметь неприятные последствия, когда строки можно интерпретировать как числа. Если вы не хотите неприятных сюрпризов, используйте & для объединения строк.

person EFraim    schedule 30.07.2009

В некоторых случаях + вызовет исключение; например следующее:

Sub SimpleObject_FloatPropertyChanging(fvalue, cancel)
   'fvalue is a floating point number
   MsgBox "Received Event: " + fvalue
End Sub

Вы получите исключение, когда источник COM-объекта инициирует событие — вы должны выполнить одно из следующих действий:

MsgBox "Received Event: " & fvalue

or

MsgBox "Received Event: " + CStr(fvalue)

В любом случае лучше использовать CStr(value); но использование & в приведенных выше комментариях для конкатенации строк почти всегда является лучшей практикой.

person Neal Davis    schedule 08.02.2014