Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Jeśli procedura deklaruje parametr jako ByRef, Visual Basic udostępnia kodowi procedury bezpośrednie odwołanie do elementu programistycznego będącego podstawą argumentu w kodzie, który go wywołuje. Pozwala to na zmianę wartości bazowej argumentu w kodzie wywołującym. W niektórych przypadkach kod wywołujący może chcieć chronić przed taką zmianą.
Argument można zawsze chronić przed zmianą, deklarując odpowiedni parametr ByVal w procedurze. Jeśli chcesz mieć możliwość zmiany danego argumentu w niektórych przypadkach, ale nie innych, możesz go ByRef
zadeklarować i pozwolić kodowi wywołującego określić mechanizm przekazywania w każdym wywołaniu. Robi to przez dołączenie odpowiedniego argumentu w nawiasach, aby przekazać go przez wartość, lub nie ujęcie go w nawiasy, aby przekazać go przez odwołanie. Aby uzyskać więcej informacji, zobacz How to: Force an Argument to Be Passed by Value (Instrukcje: wymuszanie przekazania argumentu według wartości).
Przykład
W poniższym przykładzie przedstawiono dwie procedury, które przyjmują zmienną tablicową i działają na jej elementach. Procedura increase
po prostu dodaje jeden do każdego elementu. Procedura replace
przypisuje nową tablicę do parametru a()
, a następnie dodaje jeden do każdego elementu. Jednak ponowne przypisanie nie ma wpływu na podstawową zmienną tablicową w kodzie wywołującym.
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
Pierwsze wywołanie wyświetla "After increase(n): 11, 21, 31, 41". Ponieważ tablica n
jest typem referencyjnym, increase
może zmienić swoje składowe, mimo że mechanizm przekazywania to ByVal
.
Drugie MsgBox
wywołanie wyświetla "Po zastąpieniu(n): 11, 21, 31, 41". Ponieważ n
jest przekazywane jako ByVal
, replace
nie może zmodyfikować zmiennej n
w kodzie wywołującym, przypisując do niej nową tablicę. Podczas tworzenia przez replace
nowego wystąpienia tablicy k
i przypisywania go do lokalnej zmiennej a
, traci odwołanie do n
przekazanego przez kod wywołujący. Gdy zmienia on elementy członkowskie a
obiektu , ma to wpływ tylko na tablicę k
lokalną.
replace
W związku z tym nie zwiększa wartości tablicy n
w kodzie wywołującym.
Kompilowanie kodu
Wartością domyślną w języku Visual Basic jest przekazywanie argumentów według wartości. Jednak dobrym rozwiązaniem programistycznym jest dołączenie słowa kluczowego ByVal lub ByRef z każdym zadeklarowanym parametrem. Ułatwia to odczytywanie kodu.
Zobacz także
- Procedury
- Parametry i argumenty procedury
- Instrukcje: przekazywanie argumentów do procedury
- Przekazywanie argumentów przez wartość i przez referencję
- Różnice między argumentami modyfikowalnymi i niemodyfikowalnymi
- Różnice między przekazywaniem argumentu według wartości a odwołaniem
- Instrukcje: zmienianie wartości argumentu procedury
- Jak wymusić przekazanie argumentu przez wartość
- Przekazywanie argumentów według pozycji i według nazwy
- typy wartości i typy referencyjne