В 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). Множественные экземпляры этой структуры вели к неожиданным эффектам, т.к. внутри структуры ссылки ссылались на одни и те же массивы данных — мутации отражались на всех копиях!