Visual Basic obsługuje dwa podstawowe sposoby deklaracji niezmiennych wartości — Const i ReadOnly. Const jest przeznaczony dla stałych kompilacyjnych, których wartość jest znana na etapie kompilacji. ReadOnly pozwala na inicjalizację tylko w momencie deklaracji lub w konstruktorze i utrzymuje niezmienność w czasie wykonywania.
Historycznie, od czasów VB6 i wcześniej, podobna semantyka pozwalała unikać magicznych liczb i ułatwiała utrzymanie. W VB.NET możliwości zostały rozszerzone wprowadzeniem ReadOnly dla pól instancji i klasy.
Jeśli użyjesz Const dla wartości, które są określane w czasie wykonywania lub zależą od zewnętrznych danych, mogą wystąpić błędy. Pomylenie zasięgów także prowadzi do błędów.
Użyj Const dla prostych niezmiennych wartości (liczb, ciągów), które są znane w momencie kompilacji, a ReadOnly dla przypadków, gdy wartość może być obliczana w konstruktorze, ale później — tylko do odczytu.
Przykład kodu:
Public Class MathConstants Public Const Pi As Double = 3.1415926535 Public ReadOnly Property UtcCreated As DateTime Public Sub New() UtcCreated = DateTime.UtcNow End Sub End Class
Kluczowe cechy:
Czy można zadeklarować Const dla wartości uzyskanej w czasie wykonywania (np. z pliku)?
Nie — Const wymaga wartości w momencie kompilacji. Dla inicjalizacji w czasie wykonywania należy użyć ReadOnly.
Czy pole ReadOnly może być zmienione po konstruktorze?
Nie — zmiana jest możliwa tylko w momencie inicjalizacji (lub w trakcie deklaracji, albo w konstruktorze), później dostępne jest tylko do odczytu.
Czy należy używać Const dla liczb float/double przy obliczeniach matematycznych?
Tak, jeśli wartość jest znana z góry. Ale przy użyciu w innych zestawach, zmiana wartości Const wymaga ponownej kompilacji wszystkich zależnych modułów, ponieważ kompilator wbudowuje wartość bezpośrednio.
Programista zadeklarował Const dla ścieżki do folderu, która miała być później zmieniana w różnych środowiskach (dev/prod). W rezultacie przy zmianie folderu konieczna była przebudowa wszystkich projektów korzystających z tej Const.
Zalety:
Wady:
Zrealizowano ReadOnly dla ścieżek, zainicjalizowano w konstruktorze z uwzględnieniem konfiguracji środowiska. Wartości łatwo podlegają zmianie przez ustawienia bez przebudowy całej aplikacji.
Zalety:
Wady: