Поделиться через


Структуры и классы

Обновлен: Ноябрь 2007

В Visual Basic унифицирован синтаксис структур и классов, в результате чего обе сущности по большей части поддерживают одни и те же возможности. Однако имеются и существенные различия между структурами и классами.

Преимущество классов заключается в том, что они имеют ссылочный тип: ссылки передавать эффективнее, чем переменные структур вместе со всеми данными. С другой стороны, для структур не требуется выделять память в глобальной куче.

Поскольку структура не может иметь наследников, ее следует использовать только для объектов, которым в дальнейшем не потребуются дополнительные свойства. Структуры следует применять тогда, когда нужно создать объект, экземпляры которого будут иметь небольшой размер. При этом следует принимать во внимание, как способ представления объекта (в виде структуры или класса) влияет на производительность.

Сходства

Структуры и классы схожи в следующих отношениях.

  • Они являются типом контейнера, то есть содержат другие типы в качестве элементов.

  • У них есть элементы, такие как конструкторы, методы, свойства, поля, константы, перечисления, события и обработчики событий. Однако следует отличать эти элементы от объявленных элементов структуры.

  • Их элементы могут иметь индивидуальные уровни доступа. Например, один элемент может быть объявлен как Public, а другой — Private.

  • Они могут реализовывать интерфейсы.

  • Они имеют общие конструкторы с параметрами или без параметров.

  • Они могут предоставлять свойство по умолчанию, если это свойство принимает хотя бы один параметр.

  • Они могут объявлять и создавать события и могут объявлять делегаты.

Отличия

Структуры и классы отличаются следующими особенностями.

  • Структуры являются типами значений; классы — ссылочными типами. Переменная типа структуры, в отличие от типа класса, содержит данные структуры, а не ссылки на данные.

  • Структуры используют выделенную память стека; классы — память кучи.

  • Все элементы структуры по умолчанию являются Public; переменные и константы класса по умолчанию — Private, а другие элементы класса по умолчанию являются Public. Такое поведение элементов класса обеспечивает совместимость с системой значений по умолчанию Visual Basic 6.0.

  • Структуры должны иметь хотя бы одну переменную или элемент события без общего доступа; класс может быть совершенно пустым.

  • Элементы структуры не могут быть объявлены как Protected; члены класса могут.

  • Процедура структуры может обрабатывать событие, только если она является процедурой Shared (Visual Basic)Sub, и только с помощью оператора Оператор AddHandler; любая процедура класса может обработать событие, используя либо ключевое слово Handles, либо оператор AddHandler. Дополнительные сведения см. в разделе События и обработчики событий.

  • В объявлениях переменных структуры не могут быть заданы инициализаторы или исходные размеры массивов, но это возможно в объявлениях переменных класса.

  • Структуры неявно наследуют от класса System.ValueType и не могут наследовать ни от какого другой типа; классы могут наследовать от любых классов, отличных от System.ValueType.

  • Структуры не наследуются; классы наследуются.

  • Структуры никогда не завершаются, т. е. среда CLR никогда не вызывает метод Finalize для структур; классы завершаются при помощи сборщика мусора, который вызывает метод Finalize для класса, когда обнаруживает, что не осталось активных ссылок.

  • Для структуры не требуется конструктор; для класса требуется.

  • Структуры могут иметь конструкторы, не являющиеся общими, только если они принимают параметры; классы могут иметь их как с параметрами, так и без.

Каждая структура имеет неявный открытый конструктор без параметров. Этот конструктор инициализирует все элементы данных структуры с их значениями по умолчанию. Это поведение переопределить невозможно.

Экземпляры и переменные

Так как структуры являются типами значений, каждая переменная структуры постоянно привязана к отдельному экземпляру структуры. Классы являются ссылочными типами, и переменная объекта может ссылаться на различные экземпляры класса в разное время. Это различие влияет на использование структур и классов следующим образом:

  • Инициализация. Переменная структуры неявно содержит инициализацию элементов с помощью конструктора структуры без параметров. Метод Dim s As struct1 аналогичен Dim s As struct1 = New struct1().

  • Присваивание переменным значений Когда одна переменная структуры присваивается другой или экземпляр структуры передается в аргумент процедуры, текущие значения всех элементов переменной копируются в новую структуру. Когда переменная объекта присваивается другой или передается в процедуру, копируется только указатель ссылки.

  • Присваивание значения Nothing. Переменной структуры может быть присвоено значение Nothing (Visual Basic), но экземпляр продолжает оставаться связанным с переменной. Вызов ее методов и доступ к ее элементам данных еще возможен, хотя элементы переменной заново инициализируются присвоением.

    Напротив, если задано значение переменной объекта Nothing, она не связана ни с каким экземпляром класса и доступ к какому-либо элементу через переменную невозможен, пока ей не будет присвоен другой экземпляр класса.

  • Несколько экземпляров. Переменной объекта в разное время могут быть присвоены разные экземпляры класса, и несколько переменных объекта могут одновременно ссылаться на один и тот же экземпляр класса. Изменения, внесенные в значения элементов класса, влияют на эти элементы при доступе к ним через другую переменную, указывающую на тот же экземпляр.

    Элементы структуры изолированы в пределах своего экземпляра. Изменения, внесенные в их значения, не отражаются в каких-либо других переменных структуры, даже в других экземплярах того же объявления Structure.

  • Равенство Тестирование равенства двух структур должно быть выполнено с помощью проверки "от элемента к элементу". Две переменные объекта можно сравнить с помощью метода Equals.Equals показывает, указывают ли две переменные на один и тот же экземпляр.

См. также

Задачи

Устранение неполадок, связанных с типами данных

Основные понятия

Типы данных в Visual Basic

Составные типы данных

Структуры и другие элементы программирования

Типы значений и ссылочные типы

Другие ресурсы

Реализация типов данных

Структуры: пользовательские типы данных

Общее представление о классах