Modyfikator ByVal oznacza przekazywanie parametru do procedury lub funkcji przez wartość. W Visual Basic ByVal jest stosowany domyślnie i gwarantuje, że zmiany wprowadzone na parametrze wewnątrz procedury nie wpływają na oryginalną zmienną przesłaną przez wywołującą stronę.
W klasycznych wersjach VB każdy parametr można było przekazywać na dwa sposoby: przez wartość lub przez odniesienie. Wraz z rozwojem języka i pojawieniem się złożonych typów danych (struktury, klasy) wzrosło znaczenie świadomego wyboru między ByVal a ByRef.
Błędny wybór sposobu przekazywania parametru często prowadzi do błędów: można przypadkowo zmienić zmienną kodu wywołującego lub wprost przeciwnie — oczekiwać zmian, które nie nastąpią.
ByVal stosuje się, gdy procedura musi pracować z kopią wartości. Stosowane do przekazywania typów prymitywnych, struktur, a czasami nawet typów odnoszących, jeśli ważne jest zachowanie odniesienia.
Przykład kodu:
Sub Increment(ByVal number As Integer) number += 1 End Sub Dim myValue As Integer = 10 Increment(myValue) Console.WriteLine(myValue) ' Zwraca 10, nie 11
Kluczowe cechy:
Jak zachowa się obiekt (na przykład, instancja klasy), jeśli zostanie przesłany z modyfikatorem ByVal?
Odpowiedź: Przesyłana jest kopia odniesienia do obiektu, a nie sam obiekt. Można zmienić pola obiektu z procedury — zmiany będą widoczne na zewnątrz. Tylko odniesienie, a nie obiekt, nie może zostać zastąpione nowym wewnątrz procedury z efektem dla kodu wywołującego.
Przykład kodu:
Class Counters Public Value As Integer End Class Sub ModifyCounter(ByVal c As Counters) c.Value = 999 ' Zmienia właściwość! c = New Counters() ' Ta zmiana nie jest widoczna w kodzie wywołującym End Sub Dim example As New Counters() ModifyCounter(example) Console.WriteLine(example.Value) ' Wyświetli 999
Czy wartość struktury zmieni się przy przekazywaniu ByVal, jeśli pola będą zmieniane wewnątrz procedury?
Odpowiedź: Nie, cały egzemplarz struktury jest kopiowany, a zmiany nie są przenoszone na zewnątrz. Każdy zapis struktury, na przykład, Point, w procedurze jest własny.
Czy trzeba jawnie wskazywać ByVal dla parametru?
Odpowiedź: Nie, ByVal jest używane domyślnie, jawne wskazanie tylko dla większej czytelności i przestrzegania stylu kodowania.
Programista przesyła tablicę ByVal do funkcji, spodziewając się, że elementy będą mogły zostać wprowadzone do tablicy i nowa tablica pojawi się po stronie wywołującej (de facto typ odniesienia jest przesyłany przez odniesienie).
Plusy:
Minusy:
Do przesyłania indeksu tablicy, który nie powinien być zmieniany przez funkcję, używa się ByVal. Nawet jeśli w środku zmieniają wartość indeksu, oryginalna zmienna nie jest naruszona.
Plusy:
Minusy: