Die Community zu .NET und Classic VB.
Menü

FAQ 0131: Was ist der Unterschied zwischen ByVal und Byref?

 von 

Frage 

Was ist der Unterschied zwischen ByVal und ByRef?

Antwort  

Die Schlüsselwörter ByVal bzw. ByRef geben an, ob ein Wert als Kopie ( ByVal) oder als Referenz ( ByRef) übergeben werden sollen.
Bei der Übergabe als Kopie wird die „von aussen“ übergebene Variable nicht verändert, wie es das nachfolgendes Beispiel veranschaulicht:

Sub MachWas(ByVal i As Long)
    i = 4
End Sub

Private Sub Form_Load()
    Dim a As Long
    
    a = 1
    Debug.Print "Inhalt von a vor Funktionsaufruf: " & CStr(a)
    
    MachWas a
    Debug.Print "Inhalt von a nach Funktionsaufruf: " & CStr(a)
End Sub

Listing 1: Beispiel für ByVal

Wie man sieht, hat die Variable a nach dem Aufruf von MachWas noch immer den Wert 1, weil die Methode MachWas intern mit der Variablen i gearbeitet hat, welche die Kopie des Wertes von a enthält.

Wenn wir wollen, daß die originale (übergebene) Variable geändert wird, so müssen wir das Beispiel folgendermaßen umschreiben:

Sub MachWas(ByRef i As Long)
    i = 4
End Sub

Listing 2: Beispiel für ByRef

Wenn wir das Programm noch einmal laufen lassen, stellen wir fest, daß sich der Inhalt der Variablen a jetzt geändert hat.

Ein sinnvolles Beispiel für die Verwendung von ByRef könnte folgendes Beispiel sein, welches die Methode Inc (Erhöhen) und Dec (Erniedrigen) aus anderen Sprachen und Basic-Dialekten nachbildet:

Public Sub Inc(ByRef lValue As Long)
    lValue = lValue + 1
End Sub

Public Sub Dec(ByRef lValue As Long)
    lValue = lValue - 1
End Sub

Listing 3: Einfaches Beispiel

Wenn wir diese beiden Methoden in ein Modul packen, stehen uns ab sofort die beiden Funktionen global zur Verfügung, statt i = i + 1 (resp. i = i - 1) brauchen wir fortan nur noch Inc i (resp. Dec i) zu schreiben.

Wer mag, kann das Beispiel auch noch erweitern. Das Schlüsselwort Optional gibt an, daß die Angabe dieses Paramaters möglich, aber nicht notwendig ist. Wenn nichts angegeben wird, so wird standardmäßig 1 verwendet. Nun kann eine andere Schrittweite angegeben werden.

Public Sub Inc(ByRef lValue As Long, Optional ByVal Steps As Long = 1)
    lValue = lValue + Steps
End Sub

Public Sub Dec(ByRef lValue As Long, Optional ByVal Steps As Long = 1)
    lValue = lValue - Steps
End Sub

Listing 4: Kombiniertes Beispiel

Hinweis : Steuerelemente werden immer als ByRef übergeben, da die Variable nur einen Zeiger auf das Objekt bereithält. Hier ist es unnütz, zwischen Kopie und Original zu unterscheiden, da beide auf das gleiche Objekt verweisen.

Ihre Meinung  

Falls Sie Fragen zu dieser FAQ haben, Ihre Erfahrung mit anderen Nutzern austauschen möchten oder auf eine Ergänzung hinweisen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.