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

In Visual Basic können Sie ein Argument als Wert oder durch Verweis an eine Prozedur übergeben. Dies wird als Übergabemechanismus bezeichnet und legt fest, ob die Prozedur das dem Argument zugrunde liegende Programmierelement im aufrufenden Code ändern kann. Die Prozedurdeklaration bestimmt den Übergabemechanismus für jeden Parameter durch Angeben eines der Schlüsselwörter ByVal oder ByRef.

Unterscheidungen

Beachten Sie beim Übergeben eines Arguments an eine Prozedur mehrere Unterscheidungen, die miteinander interagieren:

  • Ist das zugrunde liegende Programmierelement änderbar?

  • Ist das Argument selbst änderbar?

  • Wird das Argument als Wert oder durch Verweis übergeben?

  • Handelt es sich bei dem Datentyp des Arguments um einen Werttyp oder einen Verweistyp?

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

Auswahl des Übergabemechanismus

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

  • Schutz. Bei der Auswahl zwischen den beiden Übergabemechanismen ist das wichtigste Kriterium die Möglichkeit zum Ändern der aufrufenden Variablen. Der Vorteil der Übergabe eines Arguments ByRef besteht darin, dass die Prozedur über dieses Argument einen Wert an den aufrufenden Code zurückgeben kann. Der Vorteil der Übergabe eines Arguments ByVal besteht darin, dass eine Variable davor geschützt wird, von der Prozedur geändert zu werden.

  • Leistung: Obwohl sich der Übergabemechanismus auf die Leistung Ihres Codes auswirken kann, ist der Unterschied in der Regel unwesentlich. Eine Ausnahme ist ein ByVal übergebener Werttyp. In diesem Fall kopiert Visual Basic den gesamten Dateninhalt des Arguments. Für einen großen Werttyp wie eine Struktur kann es daher effizienter sein, ihn ByRef zu übergeben.

    Bei Verweistypen wird nur der Zeiger auf die Daten kopiert (vier Byte auf 32-Bit-Plattformen, acht Byte auf 64-Bit-Plattformen). Daher können Sie Argumente vom Typ String oder Object als Wert übergeben, ohne die Leistung zu beeinträchtigen.

Festlegung des Übergabemechanismus

In der Prozedurdeklaration wird der Übergabemechanismus für jeden Parameter angegeben. Der aufrufende Code kann einen ByVal-Mechanismus nicht außer Kraft setzen.

Wenn ein Parameter mit ByRef deklariert wird, kann der aufrufende Code den Mechanismus als ByVal erzwingen, indem der Argumentname in Klammern in den Aufruf eingeschlossen wird. Weitere Informationen finden Sie unter Erzwingen, dass ein Argument als Wert übergeben wird.

Die Standardeinstellung in Visual Basic besteht darin, Argumente nach Wert zu übergeben.

Gründe für das Übergeben eines Arguments als Wert

  • Wenn das dem Argument zugrunde liegende aufrufende Codeelement ein nicht veränderbaren Element ist, deklarieren Sie den entsprechenden Parameter ByVal. Kein Code kann den Wert eines nicht veränderbaren Elements ändern.

  • Wenn das zugrunde liegende Element veränderbar ist, Sie aber nicht möchten, dass die Prozedur ihren Wert ändern kann, deklarieren Sie den Parameter ByVal. Nur der aufrufende Code kann den Wert eines veränderbaren Elements ändern, das als Wert übergeben wird.

Gründe für das Übergeben eines Arguments durch Verweis

  • Wenn die Prozedur das zugrunde liegende Element im aufrufenden Code wirklich ändern muss, deklarieren Sie den entsprechenden Parameter ByRef.

  • Wenn die richtige Ausführung des Codes von der Prozedur abhängt, die das zugrunde liegende Element im aufrufenden Code ändert, deklarieren Sie den Parameter ByRef. Wenn Sie ihn als Wert übergeben oder der aufrufende Code den Übergabemechanismus ByRef außer Kraft setzt, indem das Argument in Klammern eingeschlossen wird, kann der Prozeduraufruf zu unerwarteten Ergebnissen führen.

Beispiel

Beschreibung

Im folgenden Beispiel wird veranschaulicht, in welchen Fällen Argumente als Wert übergeben werden sollten und in welchen Fällen durch Verweis. Die Prozedur Calculate verfügt sowohl über einen Parameter ByVal als auch über einen ByRef. Bei einem Zinssatz rate und einer Geldsumme debt besteht die Aufgabe der Prozedur darin, einen neuen Wert für debt zu berechnen, der das Ergebnis der Anwendung des Zinssatzes auf den ursprünglichen Wert von debt ist. Da debt ein Parameter ByRef ist, wird die neue Summe im Wert des Arguments im aufrufenden Code widerspiegelt, der debt entspricht. Parameter rate ist ein Parameter ByVal, da der Wert nicht von Calculate geändert werden soll.

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