Передача аргументов в процедуру
 
Передача информации в процедуры.

Декларация параметров

Процедуры могут получить информацию в виде переменных и объектов. В контексте вызова процедуры эти переменные и объекты, называются аргументами. Затем эти аргументы представляются в виде так называемых параметров внутри тела процедуры. Параметры могут использоваться так же, как любая другая переменная или объект.

Чтобы процедура могла принимать аргументы при вызове, нужно объявить процедуру со списком параметров. Список параметров приведенный списком из одного или нескольких имен и типов, процедура будет использовать при ссылке на аргументы, которые передаются ей. Список параметров окружается скобками.

Sub Procedure (s As String, n As Integer)
    Print "The parameters have the values: " & s & " and " & n
End Sub

Procedure "abc", 123

выдаст следующий результат:

The parameters have the values: abc and 123
Существует два способа передачи аргументов процедур: по значению и по ссылке. По умолчанию аргументы передаются по значению, если не указано иное.

Передача аргументов по значению

Аргументы, передаваемые по значению на самом деле не передаются в процедуру; в реале создается копия аргумента и отправляется в процедуру. Это позволяет процедуре изменять копию, а оригинал переменной или объекта остается неизменным.

При передаче объектов в процедуру по значению, копия создается путем вызова копии конструктора Type или Class.

Чтобы указать, что аргумент должен передаваться по значению, в объявлении процедуры перед именем параметра нужно указать ключевое слово ByVal.

Sub Procedure (ByVal param As Integer)
    param *= 2
    Print "The parameter 'param' = " & param
End Sub

Dim arg As Integer = 10
Print "The variable 'arg' before the call = " & arg
Procedure(arg)
Print "The variable 'arg' after the call = " & arg

выдаст следующий результат:

The variable 'arg' before the call = 10
The parameter 'param' = 20
The variable 'arg' after the call = 10
Обратите внимание на то, что скобки окружают аргументы,  в нашем случае только один, arg - при вызове процедуры. Эти скобки являются необязательными, но являются общей конвенцией для обозначения вызова процедуры.

Передача аргументов по ссылке

В отличие от аргументов, которые передаются по значению,  аргументы, которые передаются к процедурам по ссылке действительно передаются в процедуру, а не копия ее. Это позволяет процедуре изменять оригинальную переменную или объект, которые были переданы ей.

Ссылка, как псевдоним для переменной или объекта. Всякий раз, когда вы ссылаетесь на ссылку, вы имеете в виду фактическую переменную или объект, только под псевдонимом. Другими словами вы можете думать о ссылочном параметре процедуры как об аргументе, который передан напрямую; любые изменения в параметре, переданном по ссылке на самом деле изменяют сам аргумент.

Чтобы указать, что аргумент должен передаваться по ссылке, в объявлении процедуры перед именем параметра нужно указать ключевое слово ByRef.

Sub Procedure (ByRef param As Integer)
    param *= 2
    Print "The parameter 'param' = " & param
End Sub

Dim arg As Integer = 10
Print "The variable 'arg' before the call = " & arg
Procedure(arg)
Print "The variable 'arg' after the call = " & arg

выдаст следующий результат:

The variable 'arg' before the call = 10
The parameter 'param' = 20
The variable 'arg' after the call = 20

Передача вручную указателей по ссылке в параметры

Указав ключевое слово Byval перед аргументом для параметра ByRef, адрес (обычно хранится в указателе) может быть передан непосредственно как есть, заставив параметр ByRef ссылаться на то же расположение в памяти, которое указывает адрес.

Sub f( ByRef i As Integer )
    i = 456
End Sub

Dim i As Integer = 123
Dim pi As Integer Ptr = @i

Print i
f( ByVal pi )
Print i


См. также