Delen via


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 argument ByVal 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 het ByRefdoor 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 of Object 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 het ByRef 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, rateen een som van geld, debtis 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