Указывает, что результат функции возвращается по ссылке
Синтаксис
Описание
Указывает, что результат должен быть возвращен по ссылке, а не по значению.
Функция, возвращающая ByRef вернет адрес переменной в
которой лежит значение, вместо копии значения, как она обычно делает,
возвращая по значению. Это позволяет вызывающей функции изменить переменную,
на результат которой функция указывает.
Если ByRef не указано, по умолчанию возвращается результат
выполнения функции по значению.
Функции с ByRef в виде результата не должны возвращать
локальные переменные из функции, потому что они будут уничтожены после
возврата из функции, и все ссылки и указатели на локальные переменные будут
недействительными. Чтобы помочь с написанием безопасного кода, компилятор
выдаст сообщение об ошибке, когда локальная переменная используется в
выражениях: Function = x (или name = x) или Return x.
Примечание: На левой стороне в выражении присваивания, результат
функции (возвращенного ссылкой) должен быть заключен в скобки, когда функция
вызывает один единственный аргумент (список аргументов, даже если он пуст,
должен быть окружен со скобками).
Операторы (элементы или глобальные), при использовании в качестве функций,
имеют возможность вернуть результаты по ссылке, с помощью того же
синтаксиса.
Пример
Function f( ) ByRef As Const ZString
'' Эта
строка переменной длины будет возвращена по ссылке, ни одна копия не будет
создана.
Function = "abcd"
End Function
Print f( )
Dim Shared As String s
Function f1( ) ByRef As String
'' Эта
строка переменной длины будет возвращена по ссылке, ни одна копия не будет
создана.
Function = s
End Function
Function f2( ByRef _s As String ) ByRef As String
'' Эта строка переменной длины будет
возвращена по ссылке, ни одна копия не будет создана.
Function = _s
End Function
s = "abcd"
Print s
f1( ) &= "efgh"
Print s
'' На момент написания, здесь
требуются скобки.
( f2( s ) ) &= "ijkl"
Print s
Function power2( ByRef _I As Integer ) ByRef As Integer
_I *= _I
'' Этот integer
будет возвращен по ссылке, ни одна копия не будет
создана.
Function = _I
End Function
Dim As Integer I = 2
power2( power2( power2( I ) ) ) '' Возврат
функции ByRef каскадно эквивалентен ((I*I)*(I*I))*((I*I)*(I*I)) = I^8
Print I
Отличия от QB
См. также