foo x vs foo(x)
От: Аноним  
Дата: 12.06.13 09:52
Оценка:
Обнаружил, что код
Public db as OraDatabase

Sub ExecSQL( ByRef DbInstance as OraDatabase )
     db.ExecSQL("xxxx")
End Sub

...

ExecSQL( db )


вызывает ошибку времени выполнения, в то время как вызов
ExecSQL db


отрабатывает, как и ожидалось.
В чем разница между ними?
Re: foo x vs foo(x)
От: Vi2 Удмуртия http://www.adem.ru
Дата: 12.06.13 10:31
Оценка: 31 (3)
Здравствуйте, Аноним, Вы писали:

А>В чем разница между ними?


Заключенный между скобками текст — это вычисляемое выражение для VB, соответственно, он его пытается вычислить вплоть до уже невычисляемого типа. Результат вычисления помещается во временное хранение, получает локальное имя и в дальнейшем ничем не отличается от использования без скобок***.

("xxxx") эквивалентно просто "xxxx", поэтому не вызывает ошибок, но (string_var) уже не равно string_var, потому что передаётся фактически значение, т.е. всегда ByVal и string_var не может быть изменено в функции, даже если параметр передаётся ByRef. Иногда это удобно.

С объектами дело обстоит сложнее, потому что VB пытается — рекурсивно — вызвать у объекта его "метод-по-умолчанию" (тот метод, который имеет ID, равным 0), не передавая туда никаких параметров (т.е. трактует выражение db как db()). Вероятно, OraDatabase имеет "метод-по-умолчанию", но имеет дополнительные параметры, или же из метода возвращает нечто, что не приводится к нужному "as OraDatabase".

***
Скобки выражения нужно отличать от скобок при вызове функции. По синтаксису ExecSQL db эквивалентно Call ExecSQL(db) и, следовательно, ExecSQL( db ) == ExecSQL (db) == Call ExecSQL((db)).

Если бы ExecSQL имело бы больше параметров, то ExecSQL p1, p2, p3 был бы эквивалентен Call ExecSQL(p1, p2, p3), а ExecSQL(p1, p2, p3) вызывало бы ошибку синтаксиса, т.к. это недопустимое выражение. Однако допустимо указывать "лишние" скобки в ExecSQL (p1), p2, (p3) или Call ExecSQL((p1), p2, (p3)) с указанными выше соображениями.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.