Übergeben von Argumenten als Wert und als Verweis (Visual Basic)Passing Arguments by Value and by Reference (Visual Basic)

Sie können ein Argument an eine Prozedur übergeben, in Visual Basic nach Wert oder Verweisübergabe.In Visual Basic, you can pass an argument to a procedure by value or by reference. Dies bezeichnet man als den Übergabemechanismus, und es wird bestimmt, ob die Prozedur das Programmierelement zugrunde liegenden Arguments im aufrufenden Code ändern kann.This is known as the passing mechanism, and it determines whether the procedure can modify the programming element underlying the argument in the calling code. Der Prozedurdeklaration des Übergabemechanismus für die einzelnen Parameter durch Angabe der ByVal oder ByRef Schlüsselwort.The procedure declaration determines the passing mechanism for each parameter by specifying the ByVal or ByRef keyword.

UnterschiedeDistinctions

Wenn ein Argument an eine Prozedur übergeben werden, achten Sie darauf, dass Sie von mehreren verschiedenen Unterschiede, die miteinander interagieren:When passing an argument to a procedure, be aware of several different distinctions that interact with each other:

  • Gibt an, ob das zugrunde liegende Programmierelement geändert werden kann oder nicht veränderbar istWhether the underlying programming element is modifiable or nonmodifiable

  • Gibt an, ob das Argument selbst geändert werden kann oder nicht veränderbar istWhether the argument itself is modifiable or nonmodifiable

  • Gibt an, ob das Argument als Wert oder als Verweis übergebenenWhether the argument is being passed by value or by reference

  • Gibt an, ob der Datentyp des Arguments ein Werttyp oder ein Referenztyp istWhether the argument data type is a value type or a reference type

Weitere Informationen finden Sie unter Unterschiede zwischen veränderbaren und nicht veränderbaren Argumenten und Unterschiede zwischen Argumentübergabe nach Wert "und" By Reference.For more information, see Differences Between Modifiable and Nonmodifiable Arguments and Differences Between Passing an Argument By Value and By Reference.

Auswahl des ÜbergabemechanismusChoice of Passing Mechanism

Sie sollten den Übergabemechanismus für jedes Argument sorgfältig auswählen.You should choose the passing mechanism carefully for each argument.

  • Schutz.Protection. Bei der Auswahl zwischen den zwei übergeben Mechanismen, ist das wichtigste Kriterium für die Offenlegung von Aufrufen der Variablen ändern.In choosing between the two passing mechanisms, the most important criterion is the exposure of calling variables to change. Der Vorteil der Übergabe eines Arguments ByRef besteht darin, dass die Prozedur einen Wert an den aufrufenden Code durch dieses Argument zurückgeben kann.The advantage of passing an argument ByRef is that the procedure can return a value to the calling code through that argument. Der Vorteil der Übergabe eines Arguments ByVal besteht darin, dass es sich um eine Variable schützt, von der Prozedur geändert werden.The advantage of passing an argument ByVal is that it protects a variable from being changed by the procedure.

  • Leistung.Performance. Obwohl es sich bei der Übergabemechanismus die Leistung Ihres Codes auswirken kann, ist in der Regel unbedeutend.Although the passing mechanism can affect the performance of your code, the difference is usually insignificant. Einzige Ausnahme hierbei ist ein Werttyp übergeben ByVal.One exception to this is a value type passed ByVal. In diesem Fall kopiert Visual Basic den gesamten Inhalt des Arguments.In this case, Visual Basic copies the entire data contents of the argument. Aus diesem Grund für einen großen Werttyp z. B. eine Struktur, es kann effizienter sein übergeben ByRef.Therefore, for a large value type such as a structure, it can be more efficient to pass it ByRef.

    Für Verweistypen ist nur der Zeiger auf die Daten kopiert (vier Bytes auf 32-Bit-Plattformen, 8 Bytes auf 64-Bit-Plattformen).For reference types, only the pointer to the data is copied (four bytes on 32-bit platforms, eight bytes on 64-bit platforms). Aus diesem Grund können Sie Argumente des Typs übergeben String oder Object als Wert ohne Leistungseinbußen.Therefore, you can pass arguments of type String or Object by value without harming performance.

Bestimmung des dem ÜbergabemechanismusDetermination of the Passing Mechanism

Deklaration der Prozedur gibt, an dem Übergabemechanismus für jeden Parameter.The procedure declaration specifies the passing mechanism for each parameter. Der aufrufende Code kann nicht überschrieben. eine ByVal Mechanismus.The calling code can't override a ByVal mechanism.

Wenn ein Parameter mit deklariert wird ByRef, der aufrufende Code kann den Mechanismus zum erzwingen ByVal indem der Name des Arguments in Klammern angegeben im Aufruf.If a parameter is declared with ByRef, the calling code can force the mechanism to ByVal by enclosing the argument name in parentheses in the call. Weitere Informationen finden Sie unter Vorgehensweise: Erzwingen, dass ein Argument als Wert übergeben wird.For more information, see How to: Force an Argument to Be Passed by Value.

Der Standardwert in Visual Basic ist, Argumente als Wert übergeben.The default in Visual Basic is to pass arguments by value.

Wenn ein Argument als Wert übergeben.When to Pass an Argument by Value

  • Wenn der aufrufende Code-Element, das dem Argument zugrunde liegt ein nicht veränderbares Element ist, deklarieren Sie den entsprechenden Parameter ByVal.If the calling code element underlying the argument is a nonmodifiable element, declare the corresponding parameter ByVal. Kein Code kann es sich um den Wert eines Elements als nicht änderbar ändern.No code can change the value of a nonmodifiable element.

  • Wenn das zugrunde liegende Element geändert werden kann, aber nicht, dass das Verfahren, um den Wert ändern zu können möchten, deklarieren Sie den Parameter ByVal.If the underlying element is modifiable, but you do not want the procedure to be able to change its value, declare the parameter ByVal. Nur der aufrufende Code kann es sich um den Wert eines änderbaren Elements als Wert übergeben, ändern.Only the calling code can change the value of a modifiable element passed by value.

Wenn ein Argument als Verweis zu übergeben.When to Pass an Argument by Reference

  • Verfügt die Prozedur eine Notwendigkeit so ändern Sie das zugrunde liegende Element im aufrufenden Code, deklarieren Sie den entsprechenden Parameter ByRef.If the procedure has a genuine need to change the underlying element in the calling code, declare the corresponding parameter ByRef.

  • Wenn die richtige Ausführung des Codes für die Prozedur ändern das zugrunde liegende Element im aufrufenden Code abhängig ist, deklarieren Sie den Parameter ByRef.If the correct execution of the code depends on the procedure changing the underlying element in the calling code, declare the parameter ByRef. Wenn Sie ihn als Wert übergeben oder wenn der aufrufende Code überschreibt die ByRef Übergabemechanismus, indem das Argument in Klammern ein, den Aufruf der Prozedur kann zu unerwarteten Ergebnissen führen.If you pass it by value, or if the calling code overrides the ByRef passing mechanism by enclosing the argument in parentheses, the procedure call might produce unexpected results.

BeispielExample

BeschreibungDescription

Das folgende Beispiel veranschaulicht, Argumente als Wert übergeben und von ihnen als Verweis zu übergeben.The following example illustrates when to pass arguments by value and when to pass them by reference. Prozedur Calculate weist sowohl ein ByVal und ByRef Parameter.Procedure Calculate has both a ByVal and a ByRef parameter. Erhält einen Zinssatz rate, und einer Geldsumme, debt, die Aufgabe der Prozedur ist, berechnen Sie einen neuen Wert für debt , das Ergebnis des Anwendens von den Zinssatz auf den ursprünglichen Wert von debt.Given an interest rate, rate, and a sum of money, debt, the task of the procedure is to calculate a new value for debt that is the result of applying the interest rate to the original value of debt. Da debt ist eine ByRef -Parameter dem neuen Gesamtbetrag wirkt sich der Wert des Arguments im aufrufenden Code, der entspricht debt.Because debt is a ByRef parameter, the new total is reflected in the value of the argument in the calling code that corresponds to debt. Parameter rate ist eine ByVal Parameter da Calculate ändern Sie seinen Wert nicht sollten.Parameter rate is a ByVal parameter because Calculate should not change its value.

CodeCode

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 auchSee also