Freigeben über


Vorgehensweise: Ändern des Werts eines Prozedurarguments (Visual Basic)

Wenn Sie eine Prozedur aufrufen, entspricht jedes argument, das Sie angeben, einem der parameter, die in der Prozedur definiert sind. 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 Argument, das ByRef übergeben wird, gibt Visual Basic dem Prozedurcode einen direkten Verweis auf das Programmierelement, das dem Argument im aufrufenden Code zugrunde liegt.

Wenn das zugrunde liegende Element im aufrufenden Code ein modifizierbares Element ist und das Argument übergeben ByRefwird, 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 modifizierbares 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.

Sehen Sie sich das Beispiel weiter unten für eine Demonstration an.

Lokale Kopien ändern

Wenn das zugrunde liegende Element im aufrufenden Code ein nicht modifizierbares Element ist oder wenn das Argument übergeben ByValwird, kann die Prozedur den 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 ByVal 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 visual Basic gezwungen, das Argument nach Wert zu übergeben, auch wenn der entsprechende Parameter angibt ByRef.

  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 verwenden und mit den zugehörigen Elementen arbeiten. Die increase Prozedur fügt jedem Element einfach ein Element hinzu. Die replace Prozedur weist dem Parameter a() ein neues Array zu und fügt dann jedem Element ein Array 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. Da es sich bei dem Array n um einen Verweistyp handelt, kann replace seine Member ändern, auch wenn der Übergabemechanismus ByVal ist.

Der zweite MsgBox-Aufruf zeigt „After replace(n): 101, 201, 301“ an. Da n übergeben ByRef 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. Siehe Vorgehensweise: Schützen eines Prozedurarguments vor Wertänderungen.

Kompilieren des Codes

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

Die Standardeinstellung in Visual Basic besteht darin, Argumente nach Wert zu übergeben. Es empfiehlt sich jedoch, entweder das ByVal - oder ByRef-Schlüsselwort mit jedem deklarierten Parameter einzuschließen. Dadurch wird das Lesen des Codes vereinfacht.

.NET Framework-Sicherheit

Es besteht immer ein potenzielles Risiko, dass eine Prozedur den Wert ändern kann, der einem Argument im aufrufenden Code zugrunde liegt. Stellen Sie sicher, dass Sie damit rechnen, dass sich dieser Wert ändern könnte, und bereiten Sie sich darauf vor, seine Gültigkeit vor der Verwendung zu überprüfen.

Siehe auch