Property w Visual Basic służy do enkapsulacji dostępu do danych obiektu z możliwością weryfikacji, obliczeń i ustawienia kontroli dostępu. Właściwości zawierają bloki Get (do odczytu wartości) oraz Set (do ustawienia wartości).
Private _age As Integer Public Property Age() As Integer Get Return _age End Get Set(ByVal value As Integer) If value < 0 Or value > 120 Then Throw New ArgumentException("Wiek musi być w przedziale od 0 do 120!") End If _age = value End Set End Property
Dzięki takiej właściwości można zrealizować walidację wartości, caching, obliczenia w locie i inne, a dla użytkownika obiekt wygląda jak zwykłe pole.
Public Property ItemId As Integer ' automatycznie tworzy ukryte pole, brak dostępu do logiki
Niuans: automatycznych właściwości nie można rozszerzyć o wewnętrzną logikę bez wyraźnej deklaracji get/set.
Pytanie: Czy można w Visual Basic zaimplementować właściwość z tylko publicznym set i prywatnym get? Jak poprawnie ustawić różne poziomy dostępu dla get i set?
Odpowiedź: Tak, od VB.NET można podawać różne poziomy dostępu dla get i set:
Public Property Salary As Decimal Private Get Return _salary End Get Set(ByVal value As Decimal) _salary = value End Set End Property
W tym przykładzie tylko klasa może odczytać wartość Salary, zewnętrzne obiekty mogą tylko ustawiać.
Historia
Programista używał automatycznych właściwości dla wszystkich pól obiektów biznesowych. Później walidacja wprowadzenia wartości ujemnych stała się koniecznością, ale zmiana automatycznej właściwości na wyraźną wymagała ręcznej poprawy dużej części kodu, co doprowadziło do błędów i zwiększonych nakładów pracy.
Historia
W procesie migracji z VB6 do VB.NET część właściwości została zaimplementowana jako pola z publicznymi modyfikatorami dostępu: to otworzyło pełny nieautoryzowany dostęp do wewnętrznych danych klasy, co doprowadziło do niepożądanych modyfikacji stanu przez zewnętrzne obiekty.
Historia
W skomplikowanym obiekcie właściwość zawierała w bloku get dodatkowe obliczenia, w tym pracę z plikami. Przy dużej częstości wywołań właściwości wydajność aplikacji znacznie spadła; okazało się, że lepiej byłoby użyć prywatnego pola z cachingiem wyniku, zamiast obliczać wartość w locie przy każdym get.