Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Если процедура объявляет параметр как ByRef, Visual Basic предоставляет код процедуры прямую ссылку на элемент программирования, лежащий в основе аргумента в вызывающем коде. Это позволяет процедуре изменить основное значение аргумента в вызывающем коде. В некоторых случаях вызывающий код может потребоваться защитить от такого изменения.
Вы всегда можете защитить аргумент от изменения, объявив соответствующий параметр ByVal в процедуре. Если вы хотите изменить заданный аргумент в некоторых случаях, но не другие, можно объявить его ByRef и позволить вызывающему коду определить механизм передачи в каждом вызове. Это делается, заключив соответствующий аргумент в скобки, чтобы передать его по значению, или оставив его без скобок, чтобы передать его по ссылке. Дополнительные сведения см. в разделе «Как: принудительно передать аргумент по значению».
Пример
В следующем примере показаны две процедуры, которые принимают переменную массива и работают с его элементами. Процедура increase просто добавляет один к каждому элементу. Процедура replace назначает новый массив параметру a() , а затем добавляет один к каждому элементу. Однако переназначение не влияет на базовую переменную массива в вызывающем коде.
Public Sub increase(ByVal a() As Long)
For j As Integer = 0 To UBound(a)
a(j) = a(j) + 1
Next j
End Sub
Public Sub replace(ByVal a() As Long)
Dim k() As Long = {100, 200, 300}
a = k
For j As Integer = 0 To UBound(a)
a(j) = a(j) + 1
Next j
End Sub
Dim n() As Long = {10, 20, 30, 40}
Call increase(n)
MsgBox("After increase(n): " & CStr(n(0)) & ", " &
CStr(n(1)) & ", " & CStr(n(2)) & ", " & CStr(n(3)))
Call replace(n)
MsgBox("After replace(n): " & CStr(n(0)) & ", " &
CStr(n(1)) & ", " & CStr(n(2)) & ", " & CStr(n(3)))
MsgBox Первый вызов показывает "После увеличения (n): 11, 21, 31, 41". Так как массив n является ссылочным типом, increase может изменить его члены, даже если механизм передачи имеет значение ByVal.
Второй MsgBox вызов отображает "После replace(n): 11, 21, 31, 41". Так как n передается ByVal, replace переменная n в вызывающем коде не может быть изменена, назначив ему новый массив. При создании replace нового экземпляра k массива и назначении его локальной переменной a, теряется ссылка на n, передаваемую вызывающим кодом. При изменении элементов aзатрагивается только локальный массив k .
replace Поэтому не увеличивает значения массива n в вызывающем коде.
Компиляция кода
Значение по умолчанию в Visual Basic — передавать аргументы по значению. Однако рекомендуется включить ключевое слово ByVal или ByRef с каждым объявленным параметром. Это упрощает чтение кода.
См. также
- процедуры
- Параметры процедуры и аргументы
- Как передавать аргументы в процедуру
- Передача аргументов по значению и по ссылке
- Различия между модификируемыми и неизменяемыми аргументами
- Различия между передачей аргумента по значению и по ссылке
- Практическое руководство. Изменение значения аргумента процедуры
- Как принудительно передать аргумент по значению
- Передача аргументов по позиции и по имени
- Типы значений и ссылочные типы