Freigeben über


Gewusst wie: Ändern des Werts eines Prozedurarguments (Visual Basic)

Wenn Sie eine Prozedur aufrufen, entspricht jedes von Ihnen angegebenen Argument einem der in der Prozedur definierten Parameter. In einigen Fällen kann der Prozedurcode den Wert ändern, der einem Argument im aufrufenden Code zugrunde liegt. In anderen Fällen kann die Prozedur nur die lokale Kopie eines Arguments ändern.

Wenn Sie die Prozedur aufrufen, erstellt Visual Basic eine lokale Kopie jedes Arguments, das byVal übergeben wird. Für jedes von ByRef übergebene Argument stellt Visual Basic dem Prozedurcode einen direkten Verweis auf das Programmierelement zur Verfügung, das dem Argument im aufrufenden Code zugrunde liegt.

Wenn das zugrunde liegende Element im aufrufenden Code ein änderbares Element ist und das Argument ByRef übergeben wird, kann der Prozedurcode den direkten Verweis verwenden, um den Wert des Elements im aufrufenden Code zu ändern.

Ändern des zugrunde liegenden Werts

So ändern Sie den zugrunde liegenden Wert eines Prozedurarguments im aufrufenden Code

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

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

  3. Schließen Sie im aufrufenden Code das Argument nicht in Klammern in die Argumentliste ein.

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

Eine Demonstration finden Sie im Beispiel weiter unten.

Ändern lokaler Kopien

Wenn das zugrunde liegende Element im aufrufenden Code ein nicht veränderliches Element ist oder das Argument ByVal übergeben wird, kann die Prozedur ihren Wert im aufrufenden Code nicht ändern. Die Prozedur kann jedoch ihre lokale Kopie eines solchen Arguments ändern.

So ändern Sie die Kopie eines Prozedurarguments im Prozedurcode

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

    Oder

    Schließen Sie im aufrufenden Code das Argument in Klammern in die Argumentliste ein. Dadurch wird erzwungen, dass Visual Basic das Argument nach Wert übergibt, selbst wenn der entsprechende Parameter ByRef angibt.

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

Beispiel

Das folgende Beispiel zeigt zwei Prozeduren, die eine Arrayvariable annehmen und mit ihren Elementen arbeiten. Die increase-Prozedur fügt jedem Element einfach Eins hinzu. Die replace Prozedur weist dem Parameter a() ein neues Array zu und fügt dann jedem Element Eins 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 der Übergabemechanismus ByVal ist.

Der zweite MsgBox-Aufruf zeigt „After replace(n): 101, 201, 301“ an. Da ByRef an n übergeben wird, kann replace die Variable n im aufrufenden Code ä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 selbst im aufrufenden Code ändert. Weitere Informationen finden Sie unter Vorgehensweise: Schützen eines Prozedurarguments vor Wertänderungen.

Kompilieren des Codes

Wenn Sie eine Variable als Verweis übergeben, müssen Sie das Schlüsselwort ByRef verwenden, um diesen Mechanismus anzugeben.

Die Standardeinstellung in Visual Basic besteht darin, Argumente nach Wert zu übergeben. Es ist jedoch gute Programmierpraxis, bei jedem deklarierten Parameter entweder das Schlüsselwort ByVal oder ByRef anzugeben. Dies erleichtert das Lesen Ihres Codes.

.NET Framework-Sicherheit

Es besteht immer ein potenzielles Risiko, wenn Sie einer Prozedur erlauben, den einem Argument zugrunde liegenden Wert im aufrufenden Code zu ändern. Stellen Sie sicher, dass Sie mit einer Änderung dieses Werts rechnen und darauf vorbereitet sind, ihn auf seine Gültigkeit zu überprüfen, bevor Sie ihn verwenden.

Weitere Informationen