Argumenten doorgeven op waarde en verwijzing (Visual Basic)
In Visual Basic kunt u een argument doorgeven aan een procedure op waarde of op verwijzing. Dit wordt het doorgegeven mechanisme genoemd en bepaalt of de procedure het programmeerelement dat onder het argument in de aanroepcode ligt, kan wijzigen. De proceduredeclaratie bepaalt het doorgegeven mechanisme voor elke parameter door het trefwoord ByVal of ByRef op te geven.
Onderscheid
Wanneer u een argument aan een procedure doorgeeft, moet u rekening houden met verschillende verschillen die met elkaar communiceren:
Of het onderliggende programmeerelement kan worden gewijzigd of niet kan worden gewijzigd
Of het argument zelf kan worden gewijzigd of niet kan worden gewijzigd
Of het argument wordt doorgegeven door een waarde of verwijzing
Of het gegevenstype van het argument een waardetype of een verwijzingstype is
Zie Verschillen tussen wijzigbare en niet-aanpasbare argumenten en verschillen tussen het doorgeven van een argument op waarde en op verwijzing voor meer informatie.
Keuze voor het doorgeven van mechanisme
U moet het mechanisme voor doorgeven zorgvuldig kiezen voor elk argument.
Beveiliging. Bij het kiezen tussen de twee passeermechanismen is het belangrijkste criterium de blootstelling van aanroepende variabelen die moeten worden gewijzigd. Het voordeel van het doorgeven van een argument
ByRef
is dat de procedure een waarde kan retourneren aan de aanroepende code via dat argument. Het voordeel van het doorgeven van een argumentByVal
is dat een variabele niet door de procedure wordt gewijzigd.Prestaties. Hoewel het doorgevende mechanisme van invloed kan zijn op de prestaties van uw code, is het verschil meestal onbelangrijk. Eén uitzondering hierop is een waardetype dat is doorgegeven
ByVal
. In dit geval kopieert Visual Basic de volledige gegevensinhoud van het argument. Daarom kan het voor een groot waardetype, zoals een structuur, efficiënter zijn om hetByRef
door te geven.Voor referentietypen wordt alleen de aanwijzer naar de gegevens gekopieerd (vier bytes op 32-bits platforms, acht bytes op 64-bits platforms). Daarom kunt u argumenten van het type
String
ofObject
op waarde doorgeven zonder de prestaties te schaden.
Bepaling van het passeermechanisme
Met de proceduredeclaratie wordt het doorgegeven mechanisme voor elke parameter opgegeven. De aanroepende code kan een ByVal
mechanisme niet overschrijven.
Als een parameter wordt gedeclareerd met ByRef
, kan de aanroepende code het mechanisme dwingen om ByVal
de argumentnaam tussen haakjes in de aanroep te plaatsen. Zie Procedure voor meer informatie : Een argument afdwingen om door te geven door waarde.
De standaardinstelling in Visual Basic is het doorgeven van argumenten op waarde.
Wanneer een argument op waarde doorgeven
Als het aanroepende code-element onder het argument een niet-wijzigbaar element is, declareert u de bijbehorende parameter ByVal. Er kan geen code de waarde van een niet-wijzigbaar element wijzigen.
Als het onderliggende element kan worden gewijzigd, maar u niet wilt dat de procedure de waarde ervan kan wijzigen, declareert u de parameter
ByVal
. Alleen de aanroepende code kan de waarde van een wijzigbaar element wijzigen dat door de waarde wordt doorgegeven.
Wanneer een argument doorgeven op verwijzing
Als de procedure echt nodig is om het onderliggende element in de aanroepende code te wijzigen, declareert u de bijbehorende parameter ByRef.
Als de juiste uitvoering van de code afhankelijk is van de procedure die het onderliggende element in de aanroepcode wijzigt, declareert u de parameter
ByRef
. Als u deze doorgeeft op waarde of als de aanroepende code hetByRef
doorgegeven mechanisme overschrijft door het argument tussen haakjes te plaatsen, kan de procedure-aanroep onverwachte resultaten opleveren.
Opmerking
Beschrijving
In het volgende voorbeeld ziet u wanneer argumenten op waarde moeten worden doorgegeven en wanneer u ze per verwijzing doorgeeft. Procedure Calculate
heeft zowel een als ByVal
een ByRef
parameter. Gezien een rentepercentage, rate
en een som van geld, debt
is de taak van de procedure om een nieuwe waarde te debt
berekenen die het resultaat is van het toepassen van het rentepercentage op de oorspronkelijke waarde van debt
. Omdat debt
dit een ByRef
parameter is, wordt het nieuwe totaal weergegeven in de waarde van het argument in de aanroepende code die overeenkomt met debt
. Parameter rate
is een ByVal
parameter omdat Calculate
de waarde ervan niet moet worden gewijzigd.
Code
Module Module1
Sub Main()
' Two interest rates are declared, one a constant and one a
' variable.
Const highRate As Double = 12.5
Dim lowRate = highRate * 0.6
Dim initialDebt = 4999.99
' Make a copy of the original value of the debt.
Dim debtWithInterest = initialDebt
' Calculate the total debt with the high interest rate applied.
' Argument highRate is a constant, which is appropriate for a
' ByVal parameter. Argument debtWithInterest must be a variable
' because the procedure will change its value to the calculated
' total with interest applied.
Calculate(highRate, debtWithInterest)
' Format the result to represent currency, and display it.
Dim debtString = Format(debtWithInterest, "C")
Console.WriteLine("What I owe with high interest: " & debtString)
' Repeat the process with lowRate. Argument lowRate is not a
' constant, but the ByVal parameter protects it from accidental
' or intentional change by the procedure.
' Set debtWithInterest back to the original value.
debtWithInterest = initialDebt
Calculate(lowRate, debtWithInterest)
debtString = Format(debtWithInterest, "C")
Console.WriteLine("What I owe with low interest: " & debtString)
End Sub
' Parameter rate is a ByVal parameter because the procedure should
' not change the value of the corresponding argument in the
' calling code.
' The calculated value of the debt parameter, however, should be
' reflected in the value of the corresponding argument in the
' calling code. Therefore, it must be declared ByRef.
Sub Calculate(ByVal rate As Double, ByRef debt As Double)
debt = debt + (debt * rate / 100)
End Sub
End Module
Zie ook
- Procedures
- Procedureparameters en argumenten
- Procedure: Argumenten doorgeven aan een procedure
- Procedure: de waarde van een procedureargument wijzigen
- 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