Delen via


Procedure: Een procedureargument beveiligen tegen waardewijzigingen (Visual Basic)

Als een procedure een parameter declareert als ByRef, geeft Visual Basic de procedurecode een directe verwijzing naar het programmeerelement onder het argument in de aanroepcode. Hierdoor kan de procedure de waarde van het argument in de aanroepende code wijzigen. In sommige gevallen kan het zijn dat de aanroepende code bescherming wil bieden tegen een dergelijke wijziging.

U kunt een argument altijd beschermen tegen wijziging door de bijbehorende parameter ByVal in de procedure te declareren. Als u in sommige gevallen een bepaald argument wilt kunnen wijzigen, maar niet in andere, kunt u dit ByRef declareren en de aanroepende code het doorgevenmechanisme in elke aanroep laten bepalen. Dit doet u door het bijbehorende argument tussen haakjes te sluiten om het door te geven op waarde, of niet tussen haakjes om te geven. Zie Procedure voor meer informatie : Een argument afdwingen om door te geven door waarde.

Opmerking

In het volgende voorbeeld ziet u twee procedures die een matrixvariabele nemen en op de elementen ervan werken. Met de increase procedure wordt er gewoon één aan elk element toegevoegd. De replace procedure wijst een nieuwe matrix toe aan de parameter a() en voegt er vervolgens een toe aan elk element. De toewijzing heeft echter geen invloed op de onderliggende matrixvariabele in de aanroepende code.

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)))

In de eerste MsgBox aanroep wordt 'Na toename(n): 11, 21, 31, 41' weergegeven. Omdat de matrix n een verwijzingstype is, increase kunnen de leden ervan wijzigen, ook al is ByValhet doorgegeven mechanisme.

In de tweede MsgBox aanroep wordt 'Na replace(n): 11, 21, 31, 41' weergegeven. Omdat n deze wordt doorgegeven ByVal, replace kan de variabele n in de aanroepcode niet worden gewijzigd door er een nieuwe matrix aan toe te wijzen. Wanneer replace u het nieuwe matrixexemplaren k maakt en deze toewijst aan de lokale variabele a, verliest het de verwijzing die n moet worden doorgegeven door de aanroepende code. Wanneer de leden worden agewijzigd, wordt alleen de lokale matrix k beïnvloed. replace Daarom worden de waarden van de matrix n in de aanroepende code niet verhoogd.

De code compileren

De standaardinstelling in Visual Basic is het doorgeven van argumenten op waarde. Het is echter een goede programmeerpraktijk om het trefwoord ByVal of ByRef op te nemen met elke gedeclareerde parameter. Hierdoor is uw code gemakkelijker te lezen.

Zie ook