В Visual Basic свойство (Property) может быть объявлено двумя способами:
' Автоматическое свойство Public Property Name As String ' Полное свойство Private _age As Integer Public Property Age As Integer Get Return _age End Get Set(value As Integer) If value < 0 Then Throw New ArgumentException("Age can't be negative") _age = value End Set End Property
Нюансы при использовании Set:
Value — это псевдопеременная, которая ссылается на присваиваемое значение.Set можно выполнять валидацию, логирование, запуск событий.**Когда использовать: **
Чем чревата ошибка при написании
Set(ByVal value As Integer)вместоSet(value As Integer)в VB.NET? Почему так писать не стоит?
Ответ:
Синтаксис VB.NET не требует (и не поддерживает) объявление параметра ByVal явно в Set — используйте просто Set(value As Type). Если написать Set(ByVal value As Integer), это приведет к ошибке компиляции.
Пример ошибочного кода:
'Set(ByVal value As Integer) — ошибка компиляции Public Property Prop As Integer Set(ByVal value As Integer) ... End Set End Property
В классическом VB6 такой синтаксис был допустим, но в VB.NET строго требуется Set(value As Type).
История
ByVal в Set — компилятор выдавал загадочные ошибки, которые долго не могли локализовать, так как линтер не показывал чёткой причины.История
История
При копировании объектов ссылочного типа через автоматические свойства забыли реализовать deep copy через Get/Set. В результате получали дублирование ссылок на один и тот же объект; изменение в одном экземпляре приводило к изменению в другом.