ПрограммированиеVB/VB.NET разработчик

Как реализовать пользовательские типы данных (User-Defined Types, UDTs) в Visual Basic, и в каких случаях их стоит использовать вместо классов?

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

Ответ

В Visual Basic пользовательские типы данных (Type в VB6 или Structure в VB.NET) позволяют определять свои собственные составные типы, включающие несколько переменных разных типов. Это удобно для упаковки связанных данных.

UDTs (VB6):

Type Person Name As String Age As Integer Height As Single End Type Dim employee As Person employee.Name = "Алексей" employee.Age = 32 employee.Height = 1.85

Structures (VB.NET):

Structure Person Public Name As String Public Age As Integer Public Height As Single End Structure Dim employee As Person employee.Name = "Алексей"

Когда использовать:

  • Для легких контейнеров данных без логики
  • Когда важна производительность (структуры создаются в стеке)
  • Если не нужен наследуемый функционал — структуры не поддерживают наследование

В противовес: Классы используются, если нужна инкапсуляция логики, наследование, полиморфизм или реализация интерфейсов.

Вопрос с подвохом

Почему структурам в VB.NET нельзя присваивать значения Nothing?

Ответ: Только переменным классов (объектам) можно присвоить Nothing, так как они хранят ссылки. Структуры — это value-type, они всегда содержат набор значений; попытка присвоить Nothing приведет к ошибке компиляции.

Dim s As Person = Nothing 'Ошибка! Структуры не могут быть Nothing (кроме Nullable(Of T))

Примеры реальных ошибок из-за незнания тонкостей темы


История

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


История

После портирования VB6-UDT на VB.NET один из разработчиков не реализовал интерфейс ISerializable для структуры в удаленном вызове. В результате удаляемый объект не мог быть сериализован, что вызвало сбои при межпроцессном взаимодействии.


История

В модуле для работы с геометрией структура хранила ссылки на массивы (mutable). Множественные экземпляры этой структуры вели к неожиданным эффектам, т.к. внутри структуры ссылки ссылались на одни и те же массивы данных — мутации отражались на всех копиях!