Übergeben von Argumenten als Wert und als Verweis (Visual Basic)

In Visual Basic kann ein Argument als Wert oder als Verweis an eine Prozedur übergeben werden. Dies wird als Übergabemechanismus bezeichnet und legt fest, ob die Prozedur das Programmelement, das dem Argument im Aufrufcode zugrunde liegt, ändern kann. In der Prozedurdeklaration wird der Übergabemechanismus durch die Angabe des ByVal (Visual Basic)-Schlüsselworts oder ByRef (Visual Basic)-Schlüsselworts für jeden Parameter festgelegt.

Unterscheidungen

Wenn ein Argument an eine Prozedur übergeben wird, sind verschiedene Unterscheidungen zu beachten, zwischen denen eine Wechselwirkung besteht:

  • Ob das zugrunde liegende Programmierelement änderbar oder nicht veränderbar ist

  • Ob das Argument selbst änderbar oder nicht veränderbar ist

  • Ob das Argument als Wert oder als Verweis übergeben wird

  • Ob der Argumentdatentyp ein Werttyp oder ein Verweistyp ist

Weitere Informationen finden Sie unter Unterschiede zwischen veränderbaren und nicht veränderbaren Argumenten (Visual Basic) und unter Unterschiede zwischen dem Übergeben von Argumenten als Wert und als Verweis (Visual Basic).

Wahl des Übergabemechanismus

Sie sollten den Übergabemechanismus für jedes Argument sorgfältig auswählen.

  • Schutz. Bei der Wahl eines der beiden Übergabemechanismen fällt vor allem ins Gewicht, ob die Aufrufvariablen geändert werden dürfen oder nicht. Der Vorteil der Argumentübergabe ByRef besteht darin, dass die Prozedur durch dieses Argument einen Wert an den Aufrufcode zurückgeben kann. Der Vorteil der Argumentübergabe ByVal besteht darin, dass die Variable vor Änderungen durch die Prozedur geschützt wird.

  • Leistung. Möglicherweise wirkt sich der Übergabemechanismus auf die Leistung des Codes aus, jedoch ist dies normalerweise unbedeutend. Eine Ausnahme bildet ein ByVal übergebener Werttyp. Hier kopiert Visual Basic den gesamten Dateninhalt des Arguments. Deshalb kann die Übergabe ByRef bei umfassenden Werttypen wie Strukturen effizienter sein.

    Bei Verweistypen wird lediglich der Zeiger auf die Daten kopiert (vier Bytes bei 32-Bit-Plattformen, acht Bytes bei 64-Bit-Plattformen). Deshalb können Argumente vom Typ String oder vom Typ Object ohne Leistungseinbußen als Wert übergeben werden.

Bestimmen des Übergabemechanismus

Die Prozedurdeklaration gibt den Übergabemechanismus für jeden Parameter an. Der Aufrufcode kann den ByVal-Mechanismus nicht überschreiben. Wenn ein Argument jedoch mit ByRef deklariert wird, kann der Aufrufcode den ByVal-Mechanismus erzwingen, indem der Argumentname im Aufruf in runde Klammern gesetzt wird.

Standardmäßig werden Argumente in Visual Basic als Wert übergeben. Sie können den Code besser lesbar machen, indem Sie das ByVal-Schlüsselwort verwenden. Es gilt als guter Programmierstil, das ByVal-Schlüsselwort oder das ByRef-Schlüsselwort für jeden deklarierten Parameter anzugeben.

Wann ein Argument als Wert übergeben werden sollte

  • Wenn das aufrufende Codeelement, das dem Argument zugrunde liegt, ein nicht veränderbares Element ist, deklarieren Sie den entsprechenden Parameter mit ByVal (Visual Basic). Der Wert eines nicht veränderbaren Elements kann nicht geändert werden.

  • Wenn das zugrunde liegende Element änderbar ist, die Prozedur dessen Wert aber nicht ändern können soll, deklarieren Sie den Parameter mit ByVal. Nur der Aufrufcode kann den Wert eines änderbaren Elements ändern, das als Wert übergeben wird.

Wann ein Argument als Verweis übergeben werden sollte

  • Falls die Prozedur das zugrunde liegende Element im Aufrufcode unbedingt ändern können muss, deklarieren Sie den entsprechenden Parameter mit ByRef (Visual Basic).

  • Wenn die ordnungsgemäße Codeausführung von der Prozedur abhängt, die das zugrunde liegende Element im Aufrufcode ändert, deklarieren Sie den Parameter mit ByRef. Wenn er als Wert übergeben wird oder wenn der Aufrufcode den ByRef-Übergabemechanismus überschreibt, indem das Argument in Klammern angegeben wird, kann der Prozeduraufruf zu unerwarteten Ergebnissen führen.

Beispiel

Beschreibung

Im folgenden Beispiel wird veranschaulicht, in welchen Fällen Argumente als Wert und in welchen Fällen als Verweis zu übergeben sind. Die Prozedur Calculate verfügt über einen ByVal-Parameter und einen ByRef-Parameter. Gegeben sind ein Zinssatz (rate) und ein Betrag (debt). Die Aufgabe der Prozedur besteht darin, einen neuen Wert für debt zu berechnen, der sich aus der Anwendung des Zinssatzes auf den Ursprungswert von debt ergibt. Da debt ein ByRef-Parameter ist, wird der neue Gesamtbetrag im Wert des Arguments im aufrufenden Code widergespiegelt, der debt entspricht. Der Parameter rate ist ein ByVal-Parameter, da sein Wert von Calculate nicht geändert werden darf.

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

Siehe auch

Aufgaben

Gewusst wie: Übergeben von Argumenten an eine Prozedur (Visual Basic)

Gewusst wie: Ändern des Werts eines Prozedurarguments (Visual Basic)

Gewusst wie: Schützen eines Prozedurarguments gegen Wertänderungen (Visual Basic)

Gewusst wie: Erzwingen, dass ein Argument als Wert übergeben wird (Visual Basic)

Konzepte

Prozeduren in Visual Basic

Parameter und Argumente von Prozeduren (Visual Basic)

Übergeben von Argumenten nach Position und Name (Visual Basic)

Weitere Ressourcen

Datentypimplementierung (Visual Basic)