Porady: chronienie argumentu procedury przed zmianami wartości (Visual Basic)
Jeśli procedura deklaruje parametr jako ByRef, Visual Basic udostępnia kod procedury bezpośredni odwołanie do elementu programowania bazowego argumentu w kodzie wywołującym. 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 komunikat "After increase(n): 11, 21, 31, 41". Ponieważ tablica n
jest typem odwołania, increase
może zmienić jego składowe, mimo że mechanizm przekazywania to ByVal
.
Drugie MsgBox
wywołanie wyświetla komunikat "After replace(n): 11, 21, 31, 41". Ponieważ n
przekazano ByVal
zmienną , replace
nie można zmodyfikować zmiennej n
w kodzie wywołującym, przypisując do niej nową tablicę. Podczas replace
tworzenia nowego wystąpienia k
tablicy i przypisywania go do zmiennej a
lokalnej 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 też
- z konkretnym obiektem
- Parametry i argumenty procedur
- Instrukcje: przekazywanie argumentów do procedury
- Przekazywanie argumentów według wartości i według odwołania
- Różnice między argumentami modyfikowalnymi i niemodyfikowalnymi
- Różnice między przekazywaniem argumentu według wartości i według odwołania
- Instrukcje: zmiana wartości argumentu procedury
- Instrukcje: wymuszanie przekazywania argumentu przez wartość
- Przekazywanie argumentów według pozycji i według nazwy
- Typy wartości i odwołań