Ü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 ArgumentsByVal
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, ihnByRef
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
oderObject
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 ÜbergabemechanismusByRef
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
- Vorgehensweisen
- Parameter und Argumente von Prozeduren
- Vorgehensweise: Übergeben von Argumenten an eine Prozedur
- Vorgehensweise: Ändern des Werts eines Prozedurarguments
- Vorgehensweise: Schützen eines Prozedurarguments gegen Wertänderungen
- Vorgehensweise: Erzwingen, dass ein Argument als Wert übergeben wird
- Übergeben von Argumenten nach Position und Name
- Value Types and Reference Types