Поделиться через


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

Обновлен: Ноябрь 2007

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

Различия

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

  • Является ли базовый элемент программирования изменяемым или неизменяемым

  • Является ли сам аргумент изменяемым или неизменяемым

  • Аргумент передается по значению или по ссылке

  • Является ли тип данных аргумента типом значения или ссылочным типом

Дополнительные сведения см. в разделах Различия между аргументами Modifiable и Nonmodifiable и Различия между передачей аргумента по значению и по ссылке.

Выбор механизма передачи

Необходимо осторожно выбирать механизм передачи для каждого аргумента.

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

  • Производительность. Хотя механизм передачи также может повлиять на производительность кода, разница практически не заметна. Единственным исключением является передача типа значения ByVal. В этом случае Visual Basic копирует все содержимое аргумента. Таким образом, большие аргументы типа значения (например структуру) целесообразнее передавать ByRef.

    Для ссылочных типов копируется только указатель на данные (четыре байта на 32-разрядных платформах, восемь байтов на 64-разрядных платформах). Таким образом можно передавать аргументы типа String или Object по значению без потери производительности.

Определение механизма передачи

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

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

Когда передается аргумент по значению

  • Если элемент кода вызова, содержащийся в аргументе, является неизменяемым, объявите соответствующий параметр ByVal. Никакой код не может изменить значение неизменяемого элемента.

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

Когда аргумент передается по ссылке

  • Если процедуре необходимо изменить базовый элемент в коде вызова, объявите соответствующий параметр ByRef.

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

См. также

Задачи

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

Практическое руководство. Изменение значения аргумента процедуры

Практическое руководство. Защита аргумента процедуры от изменения значения

Практическое руководство. Принудительная передача аргумента по значению

Основные понятия

Процедуры в Visual Basic

Параметры и аргументы процедуры

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

Типы значений и ссылочные типы