Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz 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 aobiektu , 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