В предыдущих версиях Visual Basic существовала возможность создания определяемых пользователем типов данных {User Defined Data Types, или UDT) с помощью оператора Туре. Определяемый пользователем тип данных, как показано в листинге 7.12, представляет собой объединение нескольких различных типов в один тип данных.
ТИП Employee в Visual Basic 6.0
Public Type Employee FirstName as String LastName as String SocialSecurityNumber as String BirthDate as Date Dependents as Integer End Type В VB.NET, как показано в листинге 7.13, оператор Туре заменен оператором Structure. ЛИСТИНГ 7.13. Структура типа Employee в VB.NET Public Structure Employee Public FirstName as String Public LastName as String Public SocialSecurityNumber as String Public BirthDate as Date Public Dependents as Integer End Structure
Оператор S t r u c t u r e фактически создает численный тип. В действительности структуры представляют собой тип численного класса. В языке VB.NET структура содержит не только типы данных, но также свойства и методы. все индивидуальные типы данных, за исключением поля SocialSecurityNumber, имеют общие модификаторы доступности. Все элементы структуры в языке VB.NET должны иметь модификатор доступности. В VB.NET появилась новая возможность, позволяющая ограничивать область доступа для отдельных элементов структуры. В предыдущих версиях Visual Basic подобной возможности для определяемых пользователем типов не существовало. Кроме этого, структуры могут иметь свойства и методы.
На первый взгляд может показаться, что тип S t r u c t u r e практически ничем не отличается от класса. По многим показателям это действительно так, но в то же время имеется ряд существенных отличий.
Пример структуры
Public Structure TEmployee Public FirstName as String Public LastName as String Private SocialSecurityNumber as String Public BirthDate as Date Public Dependents as Integer Readonly Property FullName Get Return FirstName & " " & LastName End Get End Property
Public Function CalculateExemptionAmount(ByVal _ AmountPerDependent as Decimal) as Decimal Return AmountPerDependent * Dependents End Function End Structure
Структуры размещены в памяти не как объекты, а как численные типы (к численным типам относятся встроенные типы данных, такие как I n t e g e r , Boolean и т.п.). Результатом этого является повышение эффективности их обработки и, как следствие, снижение затрат на "сборку мусора" и подобные операции. Поэтому эффективность структур гораздо выше. Структуры не могут наследоваться из класса или структуры; точно так же другая структура или класс не могут наследоваться из структуры.
Кроме этого, структуры совершенно по-разному относятся к конструкторам и деструкторам. Пример класса, созданного при обращении оператора New к классу, приведен ниже.
Dim oEmployee as New CEmployee
Подобный метод не может использоваться при создании структуры. Это связано с тем, что структура, как и любые другие численные типы, не должна создаваться явно. Ниже приведен пример создания структуры. Dim tEmployee as TEmployee
После того как структура создана, значения всех ее элементов приводятся к значениям по умолчанию, заданным .NET Framework. (Значения численных типов по умолчанию равны 0, строковых — пустой строке, значения типа Boolean равны False.)
Структуры могут содержать конструкторы, но в то же время не могут иметь конструктор, заданный по умолчанию. Это связано с тем, что среда .NET Framework создает для структуры один конструктор неявно.
При этом структурам не разрешено иметь деструкторы. Как только переменная "выпадет" из области действия структуры или ей будет присвоено нулевое значение, CLR, используемая для поддержания эффективности структур, очистит область памяти, в которой размещена данная структура.
Структуры, подобные классу Туре в Visual Basic 6.0, представляют собой достаточно полезный тип для создания простых структур данных и должны использоваться для тех же целей. Структуры не должны применяться для представления сложного объекта, а скорее, в качестве фрагмента данных с некоторыми простыми функциями.