Структура (классическая) — это конструкция языка, позволяющая содержать в себе набор полей различных типов.
1 2 3 4 5 |
struct MyStruct { int minute; static int second; } |
Структуры появились еще во времена процедурного программирования, когда еще не было ООП, созданы они были для удобства программирования. Применялись для группировки схожих по смыслу роду деятельности переменных.
В структурах нельзя инициализировать поля непосредственно в месте создания. Инициализация статических полей необязательна.
Структуры хранятся в стеке и обычно используются для инкапсуляции небольших групп связанных переменных.
- Стек – это специальная область памяти в которой хранятся структурные типы.
Структуры могут содержать конструкторы, константы, поля, методы, свойства, индексаторы, операторы, события и вложенные типы, однако, если требуются несколько таких членов, рекомендуется использовать тип class .
При наличии пользовательского конструктора, все не инициализированные поля должны быть в нем инициализированы.
1 2 3 4 5 6 7 8 9 10 |
struct MyStruct { int minute; int item; public MyStruct(int item) { this.item=item; minute = 4; } } |
- Структурам запрещается иметь конструктор по умолчанию.
- Структуры могут реализовывать интерфейсы, но они не могут наследоваться от структур или классов, по сколько уже наследуются не явно от абстрактного класса ValueType .
- В C# можно наследоваться только от одного класса и множество интерфейсов. От структур наследоваться запрещено!
- Структуры могут содержать вложенные структуры и классы.
1 2 3 4 5 6 7 8 9 |
struct MyStruct { public struct NestedStruct { public void Method() { } } } |
Поведение структур:
- Структуры размещаются в стеке .
- При копировании структур, создаётся отдельная копия объекта, которая живёт «своей жизнью».
- От структур нельзя наследоваться.
- Структуры могут наследоваться только от интерфейсов.
- Не разрешается дополнение своими свойствами;
- При передаче структуры как параметра передается вся структура.
- В структуре нельзя создать конструктор по умолчанию.
- Структура уничтожается при выходе за пределы видимости.
В чем разница между структурами и классами?
Давайте выделим их главные отличия:
- В структурах нельзя инициализировать поля непосредственно в месте создания, а в классах можно.
- Попытка вызова значения не инициализированного поля в структурах приведет к ошибке.
- В структурах в отличии от классов, нельзя явно создавать конструктор по умолчанию.
- Если в коде имеется пользовательский конструктор, он обязан про инициализировать все поля в структурах иначе возникнет ошибка, в классах это делать не обязательно.
- Структуры могут быть как динамические в этом случаи они располагаются на куче, и статичные в этом случаи они располагаются в стеке. А классы всегда на куче.
- Статический конструктор будет вызываться в связке с пользовательским конструктором в случаи структур.
Boxing — UnBoxing
Упаковка представляет собой процесс преобразования структурного типа в тип object или любой другой тип интерфейса, реализуемый этим типом. Операция распаковки извлекает структурный тип из объекта.
1 2 3 4 5 6 |
static void Main() { int item = 10; object obj = item; //упаковка переменно Boxing int item2 = (int)obj //распаковка переменно UnBoxing } |
Упаковка(Boxing) — преобразование структурного типа(типа значения) в ссылочный тип (Object или любой другой тип интерфейса, реализуемый этим типом значения). Когда тип значения упаковывается средой CLR, она создает программу-оболочку значения внутри System.Object и сохраняет ее в управляемой куче.
Распаковка (Unboxing) — преобразование ссылочного типа в структурный тип. Операция распаковки-преобразования извлекает тип значения из объекта. Перед распаковкой среда выполнения проверяет совместимость между объектом и структурой, в которую будет происходить распаковка. Распаковка должна производиться только в тот тип, из которого производилась упаковка.