Структуры и классы (Visual Basic)
Visual Basic объединяет синтаксис структур и классов с результатом, который обе сущности поддерживают большинство одинаковых функций. Однако существуют также важные различия между структурами и классами.
Классы имеют преимущество быть ссылочными типами— передача ссылки является более эффективной, чем передача переменной структуры со всеми его данными. С другой стороны, структуры не требуют выделения памяти в глобальной куче.
Так как не удается наследовать от структуры, структуры должны использоваться только для объектов, которые не должны быть расширены. Используйте структуры, когда объект, который вы хотите создать, имеет небольшой размер экземпляра и учитывает характеристики производительности классов и структур.
Сходства
Структуры и классы похожи в следующих отношениях:
Оба типа являются типами контейнеров , что означает, что они содержат другие типы в качестве членов.
Оба имеют элементы, которые могут включать конструкторы, методы, свойства, поля, константы, перечисления, события и обработчики событий.
Члены обоих элементов могут иметь отдельные уровни доступа. Например, один член может быть объявлен
Public
и другимPrivate
.Оба могут реализовывать интерфейсы.
Оба могут иметь общие конструкторы с параметрами или без них.
Оба могут предоставлять свойство по умолчанию, если это свойство принимает по крайней мере один параметр.
Оба могут объявлять и вызывать события, и оба могут объявлять делегатов.
Differences
Структуры и классы отличаются в следующих особенности:
Структуры — это типы значений; классы являются ссылочными типами. Переменная типа структуры содержит данные структуры, а не ссылку на данные как тип класса.
Структуры используют выделение стека; классы используют выделение кучи.
Все элементы структуры по
Public
умолчанию; переменные класса и константы по умолчанию,Private
а другие члены класса поPublic
умолчанию. Это поведение для членов класса обеспечивает совместимость с системой Visual Basic 6.0 по умолчанию.Структура должна иметь по крайней мере один не общий или не общий элемент события; Класс может быть полностью пустым.
Элементы структуры не могут быть объявлены как
Protected
члены класса.Процедура структуры может обрабатывать события только в том случае, если это общая
Sub
процедура и только с помощью инструкции AddHandler. Любая процедура класса может обрабатывать события с помощью обработчиков ключевое слово или инструкцииAddHandler
. Для получения дополнительной информации см. Events.Объявления переменных структуры не могут указывать инициализаторы или начальные размеры массивов; Объявления переменных класса могут.
Структуры неявно наследуются от System.ValueType класса и не могут наследоваться от любого другого типа; классы могут наследоваться от любого класса или классов, отличных System.ValueTypeот класса.
Структуры не наследуются; классы:
Структуры никогда не завершаются, поэтому среда CLR никогда не вызывает Finalize метод для любой структуры; классы завершаются сборщиком мусора (GC), который вызывает Finalize класс, когда он обнаруживает, что активные ссылки не остаются.
Структура не требует конструктора; класс выполняет.
Структуры могут иметь не совместно используемые конструкторы, только если они принимают параметры; классы могут иметь их с параметрами или без них.
Каждая структура имеет неявный открытый конструктор без параметров. Этот конструктор инициализирует все элементы данных структуры в значения по умолчанию. Это поведение невозможно переопределить.
Экземпляры и переменные
Так как структуры являются типами значений, каждая переменная структуры постоянно привязана к отдельному экземпляру структуры. Но классы являются ссылочными типами, а переменная объекта может ссылаться на различные экземпляры классов в разное время. Это различие влияет на использование структур и классов следующими способами:
Инициализация. Переменная структуры неявно включает инициализацию элементов с помощью конструктора без параметров структуры.
Dim s As struct1
Поэтому эквивалентенDim s As struct1 = New struct1()
.Назначение переменных. При назначении одной переменной структуры другому или передаче экземпляра структуры аргументу процедуры текущие значения всех элементов переменной копируются в новую структуру. При назначении одной переменной объекта другой или передаче переменной объекта в процедуру копируется только эталонный указатель.
Назначение ничего. Значение Nothing можно назначить переменной структуры, но экземпляр продолжает быть связан с переменной. Вы по-прежнему можете вызывать методы и получать доступ к его элементам данных, хотя переменные элементы повторно инициализированы назначением.
В отличие от этого, если задана переменная объекта, вы отсообите ее от любого экземпляра класса и не сможете получить доступ к каким-либо элементам через переменную
Nothing
, пока не назначьте другому экземпляру.Несколько экземпляров. Переменная объекта может иметь разные экземпляры класса, назначенные ему в разное время, и несколько переменных объекта могут ссылаться на один и тот же экземпляр класса одновременно. Изменения, внесенные в значения членов класса, влияют на эти элементы при доступе к другой переменной, указывающей на тот же экземпляр.
Однако элементы структуры изолированы в собственном экземпляре. Изменения их значений не отражаются в других переменных структуры, даже в других экземплярах того же
Structure
объявления.Равенство. Тестирование равенства двух структур должно выполняться с помощью теста по элементу. С помощью Equals метода можно сравнить две переменные объекта. Equals указывает, указывают ли две переменные на один и тот же экземпляр.