Freigeben über


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

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

Unterschiede

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

  • Gibt an, ob das zugrunde liegende Programmierelement geändert oder nicht modifizierbar ist.

  • Gibt an, ob das Argument selbst geändert oder nicht modifizierbar ist.

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

  • Gibt an, ob der Argumentdatentyp ein Werttyp oder ein Bezugstyp ist.

Weitere Informationen finden Sie unter Unterschiede zwischen modifizierbaren und nicht modifizierbaren Argumenten und Unterschieden zwischen der Übergabe eines Arguments nach Wert und nach 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 Exposition der aufrufenden Variablen gegenüber Änderungen. Der Vorteil der Übergabe eines Arguments ByRef besteht darin, dass die Prozedur einen Wert über dieses Argument an den aufrufenden Code zurückgeben kann. Der Vorteil der Übergabe eines Arguments ByVal besteht darin, dass eine Variable nicht durch die Prozedur geändert wird.

  • Leistung. Obwohl sich der Übergabemechanismus auf die Leistung ihres Codes auswirken kann, ist der Unterschied in der Regel unbedeutend. Eine Ausnahme ist ein ByVal übergebener Werttyp. In diesem Fall kopiert Visual Basic den gesamten Dateninhalt des Arguments. Daher kann es für einen großen Werttyp wie eine Struktur effizienter sein, es ByRefzu übergeben.

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

Festlegung des Übergabemechanismus

Die Prozedurdeklaration gibt den Übergabemechanismus für jeden Parameter an. 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 So erzwingen Sie, 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 aufrufende Codeelement, das dem Argument zugrunde liegt, ein nicht modifizierbares Element ist, deklarieren Sie den entsprechenden Parameter ByVal. Kein Code kann den Wert eines nicht modifizierbaren Elements ändern.

  • Wenn das zugrunde liegende Element geändert werden kann, die Prozedur jedoch nicht in der Lage sein soll, den Wert zu ändern, deklarieren Sie den Parameter ByVal. Nur der aufrufende Code kann den Wert eines modifizierbaren Elements ändern, das über Wert übergeben wird.

Wann ein Argument anhand eines Verweises übergeben werden soll

  • Wenn die Prozedur über eine echte Notwendigkeit verfügt, das zugrunde liegende Element im aufrufenden Code zu ändern, 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 nach Wert übergeben oder wenn der aufrufende Code den ByRef Übergabemechanismus 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, wann Argumente nach Wert übergeben werden und wann sie per Verweis übergeben werden. Die Prozedur Calculate hat sowohl einen ByVal Parameter als auch einen ByRef Parameter. Angesichts eines Zinssatzes rate, und einer Summe Geldes debt, besteht die Aufgabe des Verfahrens darin, einen neuen Wert für debt zu berechnen, wobei der Zinssatz auf den ursprünglichen Wert debt angewendet wird. Da debt ein ByRef Parameter ist, wird die neue Summe im Wert des Arguments widergespiegelt, das dem debt im aufrufenden Code entspricht. Der Parameter rate ist ein ByVal Parameter, da Calculate dessen Wert nicht geändert werden soll.

Programmcode

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