Передача параметров

Функции аргументов процедур Sub

Пример: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As_

System.EventArgs) Handles MyBase.Load:

- фраза ByVal sender As System.Object означает, что контейнер (sender) передаёт в процедуру по значению (ByVal) параметры системного класса System;

- фраза ByVal e As System.EventArgs означает, что в процедуру передаются по значению (ByVal) параметры e класса обработки событий (System.EventArgs). Параметр e - это какая-то системная функция Windows;

- фраза Handles…свидетельствует о том, что выполняется процедура, вызываемая событием, в частности, загрузкой формыMyBase.Load.Если процедура вызывается по имени, то эта фраза отсутствует.

Переменные, передаваемые процедуре, называются параметрами процедуры. По умолчанию они имеют тип Object. При уточнении типа параметра Visual Basic обеспечивает задание типа параметров с помощью ключевого слова As.

Передача параметров может задаваться двумя способами:

- по значению (By value);

- по ссылке (By reference).

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

При передаче параметров по ссылке (оператор ByRef) процедура получает доступ к области памяти, в которой эта переменная хранится, в результате чего при изменении параметра в процедуре происходит возвращение прежнего значения переменной, например:

 

Module Module1

Sub Тест(ByVal A As String, ByRef B As String)

A = "Строка, передаваемая по значению"

B = " Строка, передаваемая по ссылке"

End Sub

 

Sub Main()

Dim A As String

A = "Привет"

Dim B As String

B = "Здравствуй, мир!"

MsgBox(strA & ", " & strB) 'визуализируются обе локальные переменные

Тест(A, B)

MsgBox(A & ", " & B) 'визуализируется локальная переменная по значению

'и модульная переменная - по ссылке

End Sub

End Module

В модульной процедуре "Тест" объявляется, что переменная A, являющаяся параметром процедуры, передаётся по значению (ByVal), а переменная B - передаётся по ссылке (ByRef).

При выполнении процедуры Sub Main() используются локальные переменные, имеющие те же имена, что и модульные переменные, т. е. в окне сообщения появляется текст: "Привет, Здравствуй, мир!".

Когда же выполняется процедура "Тест"(A, B), вызываемая по имени (как переменная), то переменная A, передаваемая по значению, будет инициализироваться, как и указано: по локальному значению, присвоенному в процедуре Sub_Main(), а переменная B локального значения не принимает, т. к. имеет ссылку на значение, присвоенное в модуле. Таким образом, в случае переменной B возвращается прежнее значение, и в окне сообщения появляется текст: "Привет, Строка, передаваемая по ссылке".

Объявление и присвоение переменной значения (как и для константы) может осуществляться в одной строке, например, для предыдущего кода:

Dim refstrB As String = "Здравствуй, мир!"