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


Структуры и классы (Visual Basic)

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

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

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

Сходства

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

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

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

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

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

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

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

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

Различия

Структуры и классы отличаются в следующих особенности:

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

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

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

  • Структура должна иметь по крайней мере одну неразделяемую переменную или неразделяемый, не пользовательский элемент события. Класс может быть полностью пустым.

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

  • Процедура структуры может обрабатывать события только в том случае, если она является общейSub процедурой и только с помощью инструкции AddHandler. Любая процедура класса может обрабатывать события с помощью ключевого слова Handles или инструкции AddHandler . Для получения дополнительной информации см. в событиях .

  • Объявления переменных структуры не могут указывать инициализаторы или начальные размеры массивов; Объявления переменных класса могут.

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

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

  • Структуры никогда не завершаются, поэтому общий язык CLR никогда не вызывает метод Finalize для какой-либо структуры: классы завершаются сборщиком мусора (GC), который вызывает метод Finalize для класса, когда обнаруживает отсутствие активных ссылок.

  • Структура не требует конструктора; класс выполняет.

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

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

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

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

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

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

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

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

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

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

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

См. также