Property в Visual Basic служит для инкапсуляции доступа к данным объекта с возможностью проверки, вычислений и настройки контроля доступа. Свойства содержат блоки Get (для чтения значения) и Set (для установки значения).
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("Возраст должен быть от 0 до 120!") End If _age = value End Set End Property
С помощью такого свойства можно реализовать валидацию значений, кэширование, вычисление на лету и др., а для пользователя объект выглядит так, будто это обычное поле.
Public Property ItemId As Integer ' автоматически создает скрытое поле, нет доступа к логике
Нюанс: автоматические свойства нельзя расширить внутренней логикой без явного объявления get/set.
Вопрос: Можно ли реализовать свойство в Visual Basic с только публичным set и приватным get? Как правильно задать разные уровни доступа для get и set?
Ответ: Да, начиная с VB.NET можно указывать разные уровни доступа для get и set:
Public Property Salary As Decimal Private Get Return _salary End Get Set(ByVal value As Decimal) _salary = value End Set End Property
В этом примере только класс может получить значение Salary, внешние объекты — только установить.
История
Разработчик использовал автоматические свойства для всех полей бизнес-объекта. Позже валидация на ввод отрицательных значений стала необходимой, но смена авто-свойства на явное требовала ручной правки большой части кода, что привело к ошибкам и трудозатратам.
История
В процессе миграции из VB6 в VB.NET часть свойств была реализована как поля с public модификаторами доступа: это открыло полный несанкционированный доступ к внутренним данным класса, что привело к нежелательным модификациям состояния внешними объектами.
История
В сложном объекте property содержало в get-блоке дополнительные вычисления, включая работу с файлами. При большой частоте обращений к свойству производительность приложения резко падала; выяснилось, что стоило использовать private-поле с кэшированием результата, а не вычислять значение на лету при каждом get.