Freigeben über


Gewusst wie: Ändern des Werts eines Prozedurarguments

Aktualisiert: November 2007

Im Aufruf einer Prozedur entspricht jedes Argument, das angegeben wird, einem der in der Prozedur definierten Parameter. In einigen Fällen kann der Prozedurcode den Wert ändern, der einem Argument im Aufrufcode zugrunde liegt. In anderen Fällen kann die Prozedur nur ihre lokale Kopie eines Arguments ändern.

Wenn Sie die Prozedur aufrufen, erstellt Visual Basic von jedem Argument, das mit ByVal übergeben wird, eine lokale Kopie. Für jedes mit ByRef übergebene Argument übergibt Visual Basic der Prozedur einen direkten Verweis auf das Programmierelement, das dem Argument im Aufrufcode zugrunde liegt.

Falls es sich bei dem zugrunde liegenden Element im Aufrufcode um ein änderbares Element handelt und das Argument mit ByRef übergeben wird, kann der Prozedurcode über den direkten Verweis den Wert des Elements im Aufrufcode ändern.

Ändern des zugrunde liegenden Werts

So ändern Sie den zugrunde liegenden Wert eines Prozedurarguments im Aufrufcode

  1. Geben Sie in der Prozedurdeklaration ByRef für den Parameter an, der dem Argument entspricht.

  2. Übergeben Sie im Aufrufcode ein änderbares Programmierelement als Argument.

  3. Schließen Sie im Aufrufcode das Argument in der Argumentliste nicht in Klammern ein.

  4. Verwenden Sie im Prozedurcode den Parameternamen, um dem zugrunde liegenden Element im Aufrufcode einen Wert zuzuweisen.

Dies wird anhand des folgenden Beispiels veranschaulicht.

Ändern von lokalen Kopien

Wenn es sich beim zugrunde liegenden Element im Aufrufcode um ein nicht änderbares Element handelt, oder wenn das Argument mit ByVal übergeben wird, kann die Prozedur dessen Wert im Aufrufcode nicht ändern. Die Prozedur kann jedoch die lokale Kopie eines solchen Arguments ändern.

So ändern Sie die Kopie eines Prozedurarguments im Prozedurcode

  1. Geben Sie in der Prozedurdeklaration ByVal für den Parameter an, der dem Argument entspricht.

    - oder -

    Schließen Sie im Aufrufcode das Argument in der Argumentliste in Klammern ein. Dadurch wird Visual Basic gezwungen, das Argument als Wert zu übergeben, auch wenn für den entsprechenden Parameter ByRef angegeben wird.

  2. Verwenden Sie im Prozedurcode den Parameternamen, um der lokalen Kopie des Arguments einen Wert zuzuweisen. Der zugrunde liegende Wert im Aufrufcode wird nicht geändert.

Beispiel

Im folgenden Beispiel werden zwei Prozeduren demonstriert, die eine Arrayvariable als Wert übernehmen und mit deren Elementen arbeiten. Die increase-Prozedur addiert einfach 1 zu jedem Element. Die replace-Prozedur weist dem a()-Parameter ein neues Array zu und fügt dann jedem Element 1 hinzu.

Public Sub increase(ByVal a() As Long)
    For j As Integer = 0 To UBound(a)
        a(j) = a(j) + 1
    Next j
End Sub
Public Sub replace(ByRef a() As Long)
    Dim k() As Long = {100, 200, 300}
    a = k
    For j As Integer = 0 To UBound(a)
        a(j) = a(j) + 1
    Next j
End Sub
Dim n() As Long = {10, 20, 30, 40}
Call increase(n)
MsgBox("After increase(n): " & CStr(n(0)) & ", " & _
    CStr(n(1)) & ", " & CStr(n(2)) & ", " & CStr(n(3)))
Call replace(n)
MsgBox("After replace(n): " & CStr(n(0)) & ", " & _
    CStr(n(1)) & ", " & CStr(n(2)) & ", " & CStr(n(3)))

Der erste MsgBox-Aufruf zeigt "After increase(n): 11, 21, 31, 41" an. Weil das Array n ein Verweistyp ist, kann replace seine Member ändern, obwohl ByVal als Übergabemechanismus verwendet wird.

Der zweite MsgBox-Aufruf zeigt "After replace(n): 101, 201, 301" an. Da n mit ByRef übergeben wird, kann replace die Variable n im Aufrufcode ändern und ihr ein neues Array zuweisen. Weil n ein Verweistyp ist, kann replace auch seine Member ändern.

Sie können verhindern, dass die Prozedur die Variable im Aufrufcode ändert. Weitere Informationen finden Sie unter Gewusst wie: Schützen eines Prozedurarguments gegen Wertänderungen.

Kompilieren des Codes

Die Variablenübergabe durch Verweis muss mit dem ByRef-Schlüsselwort angegeben werden.

Standardmäßig werden Argumente in Visual Basic als Wert übergeben. Beim Programmieren empfiehlt es sich jedoch, das ByVal-Schlüsselwort oder das ByRef-Schlüsselwort in jeden deklarierten Parameter aufzunehmen. Dadurch wird der Code besser lesbar.

Sicherheit

Zuzulassen, dass eine Prozedur den einem Argument zugrunde liegenden Wert im Aufrufcode ändert, birgt potenziell immer Gefahren. Sie sollten immer erwarten, dass der Wert geändert wird und vor der Verwendung dieses Werts überprüfen, ob er gültig ist.

Siehe auch

Aufgaben

Gewusst wie: Übergeben von Argumenten an eine Prozedur

Gewusst wie: Schützen eines Prozedurarguments gegen Wertänderungen

Gewusst wie: Erzwingen, dass ein Argument als Wert übergeben wird

Konzepte

Prozeduren in Visual Basic

Parameter und Argumente von Prozeduren

Übergeben von Argumenten als Wert und als Verweis

Unterschiede zwischen veränderbaren und nicht veränderbaren Argumenten

Unterschiede zwischen dem Übergeben von Argumenten als Wert und als Verweis

Argumentübergabe nach Position und Namen

Wert- und Verweistypen