Udostępnij za pośrednictwem


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 ByValzmienną , 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 alokalnej 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 też