ByVal
 
Спецификатор декларации для явной передачи параметра по значению

Синтаксис

ByVal param As datatype

Использование

[ Declare ] { Sub | Function } proc_name ( ByVal param As datatype )

Описание

ByVal в списке параметров инструкции Declare передает копию переменной, которая передается в процедуру, (для примера, в sub или function) , то есть значение переменной.

Это означает, что если передается значение переменной x , то исходная переменная x не будет изменена в любом случае; Однако, если переменная были передана через ByRef, значение исходной переменной x может быть изменено в вызываемой функции.

Примечание: для строковых аргументов, ByVal в настоящее время имеет другое значение: вместо передачи копии строки, передается указатель ZString на строковые данные, тогда как ByRef передает обычную ссылку String, т.е. указатель на FreeBASIC строковой дескриптор. Такое поведение позволяет передавать ByVal String непосредственно в процедуры C. Строка, переданная таким образом не должна быть изменена Sub/Function, так как дескриптор строки не будет обновляться. Смысл передачи String ByVal может измениться в будущем; таким образом, передачи String ByVal следует избегать. ZString больше подходит для передачи строк с завершающимся нулем в функции C.

Противоположность ByRef.

Ключевое слово ByVal также используется в контексте Byref Параметров и Результатов функций,  где оно может быть использовано для явного переопределения семантики по ссылке для того, чтобы передать или назначить указатель, как параметр Byref или результат функции. Для справки:
Пример

Sub MySub(ByVal value As Integer)
    value += 1
End Sub

Dim MyVar As Integer

MyVar = 1
Print "MyVar: "; MyVar 'вывод = 1
MySub MyVar
Print "MyVar: "; MyVar 'вывод = 1, потому что ByVal не изменит значения, переданной переменной.
Sleep
End


Различия диалектов

  • В диалекте -lang fb, ByVal является параметром по умолчанию для конвенции передачи для всех встроенных типов, за исключением String и определяемых пользователем Type которые передаются через ByRef по умолчанию.
  • В диалектах -lang qb и -lang fblite, ByRef является конвенцией передачи параметров по умолчанию.

Отличия от QB

  • QB использует только ByVal в декларациях не-Basic подпрограмм

См. также