Der Modifikator ByVal bedeutet, dass ein Parameter per Wert an eine Prozedur oder Funktion übergeben wird. In Visual Basic wird ByVal standardmäßig verwendet und stellt sicher, dass Änderungen, die mit dem Parameter innerhalb der Prozedur vorgenommen werden, die ursprüngliche, von der aufrufenden Seite übergebene Variable nicht betreffen.
In den klassischen Versionen von VB konnte jeder Parameter auf zwei Arten übergeben werden: per Wert oder per Referenz. Mit der Weiterentwicklung der Sprache und dem Hinzufügen komplexer Datentypen (Strukturen, Klassen) wurde die bewusste Wahl zwischen ByVal und ByRef immer wichtiger.
Eine falsche Wahl der Parameterübergabemethode führt häufig zu Fehlern: Man kann versehentlich die Variable des aufrufenden Codes ändern oder umgekehrt — Änderungen erwarten, die nicht eintreten werden.
ByVal wird verwendet, wenn die Prozedur mit einer Kopie des Wertes arbeiten muss. Es wird für die Übergabe von primitiven Typen, Strukturen und manchmal sogar Referenztypen verwendet, wenn es wichtig ist, die Referenz zu behalten.
Beispielcode:
Sub Increment(ByVal number As Integer) number += 1 End Sub Dim myValue As Integer = 10 Increment(myValue) Console.WriteLine(myValue) ' Gibt 10 zurück, nicht 11
Hauptmerkmale:
Wie würde sich ein Objekt (z. B. eine Instanz einer Klasse) verhalten, wenn es mit dem Modifikator ByVal übergeben wird?
Antwort: Es wird eine Kopie der Referenz auf das Objekt übergeben, nicht das Objekt selbst. Man kann die Felder des Objekts innerhalb der Prozedur ändern — die Änderungen sind von außen sichtbar. Die Referenz, nicht das Objekt, kann innerhalb der Prozedur nicht durch eine neue ersetzt werden, mit Wirkung für den aufrufenden Code.
Beispielcode:
Class Counters Public Value As Integer End Class Sub ModifyCounter(ByVal c As Counters) c.Value = 999 ' Ändert die Eigenschaft! c = New Counters() ' Diese Änderung ist dem aufrufenden Code nicht sichtbar End Sub Dim example As New Counters() ModifyCounter(example) Console.WriteLine(example.Value) ' Gibt 999 aus
Wird sich der Wert einer Struktur ändern, wenn sie per ByVal übergeben wird, während ihre Felder innerhalb der Prozedur geändert werden?
Antwort: Nein, die gesamte Instanz der Struktur wird kopiert, und Änderungen erreichen nicht nach außen. Jede Instanz der Struktur, z. B. Point, innerhalb der Prozedur ist eine eigene.
Muss ByVal für den Parameter explizit angegeben werden?
Antwort: Nein, ByVal wird standardmäßig verwendet, die explizite Angabe dient nur der besseren Lesbarkeit und Einhaltung des Coding-Stils.
Ein Entwickler übergibt ein Array per ByVal an eine Funktion und erwartet, dass Elemente in das Array eingefügt werden können und ein neues Array beim aufrufenden Code erscheint (de facto wird der Referenztyp per Referenz übergeben).
Vorteile:
Nachteile:
Zum Übergeben eines Indexes eines Arrays, der von der Funktion nicht geändert werden soll, wird ByVal verwendet. Selbst wenn der Index innerhalb der Funktion verändert wird, bleibt die ursprüngliche Variable unberührt.
Vorteile:
Nachteile: