ПрограммированиеVB.NET разработчик, разработчик бизнес-приложений

Объясните разницу между свойствами (Properties) с полными блоками Get/Set и Auto-Implemented Properties, а также расскажите о скрытых нюансах использования Value внутри Set.

Проходите собеседования с ИИ помощником Hintsage

Ответ.

В Visual Basic свойство (Property) может быть объявлено двумя способами:

  • Полное свойство (с собственными блоками Get/Set): позволяет контролировать доступ к данным, выполнять дополнительные проверки или действия при чтении/записи значения.
  • Автоматическое свойство (auto-implemented): сокращенная запись, где Get/Set не пишутся явно, а автоматически создается приватное поле:
' Автоматическое свойство 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).


История

На крупном проекте при автопереносе кода с VB6 в VB.NET был расставлен ByVal в Set — компилятор выдавал загадочные ошибки, которые долго не могли локализовать, так как линтер не показывал чёткой причины.

История

В проекте с обработкой больших датасетов использовали автоматические свойства для хранения данных, а затем возникла проблема: нужно было отслеживать, изменяется ли свойство, чтобы автоматически логировать каждое изменение. Понадобилось менять автосвойства на полные — в итоге потеряли много времени на рефакторинг, так как изначально не учли, что может понадобиться дополнительная логика в Set.

История

При копировании объектов ссылочного типа через автоматические свойства забыли реализовать deep copy через Get/Set. В результате получали дублирование ссылок на один и тот же объект; изменение в одном экземпляре приводило к изменению в другом.