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
Geef in de proceduredeclaratie ByRef op voor de parameter die overeenkomt met het argument.
Geef in de aanroepende code een wijzigbaar programmeerelement door als het argument.
Plaats in de aanroepcode het argument niet tussen haakjes in de lijst met argumenten.
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
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
.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 ByVal
het 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
- Procedures
- Procedureparameters en argumenten
- Procedure: Argumenten doorgeven aan een procedure
- Argumenten doorgeven op waarde en verwijzing
- Verschillen tussen modiable en nonmodifiable argumenten
- Verschillen tussen het doorgeven van een argument op waarde en verwijzing
- Procedure: Een procedureargument beveiligen tegen waardewijzigingen
- Procedure: Een argument afdwingen om door te geven door waarde
- Argumenten doorgeven op positie en op naam
- Waardetypen en verwijzingstypen