Delen via


Procedure: De waarde van een procedureargument wijzigen (Visual Basic)

Wanneer u een procedure aanroept, komt elk argument dat u opgeeft overeen met een van de parameters die in de procedure zijn gedefinieerd. In sommige gevallen kan de procedurecode de waarde van een argument in de aanroepende code wijzigen. In andere gevallen kan de procedure alleen de lokale kopie van een argument wijzigen.

Wanneer u de procedure aanroept, maakt Visual Basic een lokale kopie van elk argument dat wordt doorgegeven door ByVal. Voor elk argument dat DoorRef wordt doorgegeven, geeft Visual Basic de procedurecode een directe verwijzing naar het programmeerelement dat onder het argument in de aanroepcode is onderliggende.

Als het onderliggende element in de aanroepcode een wijzigbaar element is en het argument wordt doorgegeven ByRef, kan de procedurecode de directe verwijzing gebruiken om de waarde van het element in de aanroepende code te wijzigen.

De onderliggende waarde wijzigen

De onderliggende waarde van een procedureargument in de aanroepende code wijzigen

  1. Geef in de proceduredeclaratie ByRef op voor de parameter die overeenkomt met het argument.

  2. Geef in de aanroepende code een wijzigbaar programmeerelement door als het argument.

  3. Plaats in de aanroepcode het argument niet tussen haakjes in de lijst met argumenten.

  4. Gebruik in de procedurecode de parameternaam om een waarde toe te wijzen aan het onderliggende element in de aanroepende code.

Zie het voorbeeld verderop voor een demonstratie.

Lokale kopieën wijzigen

Als het onderliggende element in de aanroepcode een niet-wijzigbaar element is of als het argument wordt doorgegeven ByVal, kan de procedure de waarde ervan niet wijzigen in de aanroepende code. De procedure kan echter de lokale kopie van een dergelijk argument wijzigen.

De kopie van een procedureargument in de procedurecode wijzigen

  1. Geef in de proceduredeclaratie ByVal op voor de parameter die overeenkomt met het argument.

    – of –

    Plaats in de aanroepende code het argument tussen haakjes in de lijst met argumenten. Dit dwingt Visual Basic om het argument door te geven op waarde, zelfs als de bijbehorende parameter aangeeft ByRef.

  2. Gebruik in de procedurecode de parameternaam om een waarde toe te wijzen aan de lokale kopie van het argument. De onderliggende waarde in de aanroepcode wordt niet gewijzigd.

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.

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(ByRef 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, replace kunnen de leden ervan wijzigen, ook al is ByValhet doorgegeven mechanisme.

In de tweede MsgBox aanroep wordt 'Na replace(n): 101, 201, 301' weergegeven. Omdat n deze wordt doorgegeven ByRef, replace kan de variabele n in de aanroepende code worden gewijzigd en wordt er een nieuwe matrix aan toegewezen. Omdat n dit een verwijzingstype is, replace kunt u ook de leden ervan wijzigen.

U kunt voorkomen dat de procedure de variabele zelf wijzigt in de aanroepende code. Zie Procedure: Een procedureargument beveiligen tegen waardewijzigingen.

De code compileren

Wanneer u een variabele op basis van verwijzing doorgeeft, moet u het ByRef trefwoord gebruiken om dit mechanisme op te geven.

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.

.NET Framework-beveiliging

Er bestaat altijd een potentieel risico dat een procedure de waarde onder een argument in de aanroepcode kan wijzigen. Zorg ervoor dat u verwacht dat deze waarde wordt gewijzigd en controleer of deze geldig is voordat u deze gebruikt.

Zie ook