Различия между передачей аргумента по значению и по ссылке (Visual Basic)

При передаче одного или нескольких аргументов в процедуру каждый аргумент соответствует базовому элементу программирования в вызывающем коде. Можно передать значение этого базового элемента или ссылку на него. Это называется механизмом передачи.

передача по значению

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

Передача по ссылке

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

Передача механизма и типа элемента

Выбор механизма передачи не совпадает с классификацией базового типа элемента. Передача по значению или по ссылке ссылается на то, что Visual Basic предоставляет коду процедуры. Тип значения или ссылочный тип ссылается на то, как элемент программирования хранится в памяти.

Однако механизм передачи и тип элемента связаны друг с другом. Значение ссылочного типа — это указатель на данные в другом месте в памяти. Это означает, что при передаче ссылочного типа по значению код процедуры имеет указатель на данные базового элемента, даже если он не может получить доступ к базовому элементу. Например, если элемент является переменной массива, код процедуры не имеет доступа к самой переменной, но он может получить доступ к элементам массива.

Возможность изменять

При передаче немодифицируемого элемента в качестве аргумента процедура никогда не может изменять ее в вызывающем коде, передается ByVal ли она или ByRef.

Для изменяемого элемента в следующей таблице приводится сводка взаимодействия между типом элемента и механизмом передачи.

Тип элемента Прошло ByVal Прошло ByRef
Тип значения (содержит только значение) Процедура не может изменить переменную или любой из его членов. Процедура может изменить переменную и ее члены.
Ссылочный тип (содержит указатель на экземпляр класса или структуры) Процедура не может изменить переменную, но может изменить члены экземпляра, на который он указывает. Процедура может изменить переменную и члены экземпляра, на который он указывает.

См. также