Структуры и разновидность

Структура (классическая) — это конструкция языка, позволяющая содержать в себе набор полей различных типов.

struct MyStruct
{
int minute;
static int second;
}

Структуры появились еще во времена процедурного программирования, когда еще не было ООП, созданы они были для удобства программирования. Применялись для группировки схожих по смыслу роду деятельности переменных.

В структурах нельзя инициализировать поля непосредственно в месте создания. Инициализация статических полей необязательна.

Структуры хранятся в стеке и обычно используются для инкапсуляции небольших групп связанных переменных.

  • Стек – это специальная область памяти в которой хранятся структурные типы.

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

При наличии пользовательского конструктора, все не инициализированные поля должны быть в нем инициализированы.

struct MyStruct
{
int minute;
int item;
public MyStruct(int item)
{
this.item=item;
minute = 4;
}
}
  • Структурам запрещается иметь конструктор по умолчанию.
  • Структуры могут реализовывать интерфейсы, но они не могут наследоваться от структур или классов, по сколько уже наследуются не явно от абстрактного класса ValueType .
  • В C# можно наследоваться только от одного класса и множество интерфейсов. От структур наследоваться запрещено!
  • Структуры могут содержать вложенные структуры и классы.
struct MyStruct
{
public struct NestedStruct
{
public void Method()
{
}
}
}

Поведение структур:

  • Структуры размещаются в стеке .
  • При копировании структур, создаётся отдельная копия объекта, которая живёт «своей жизнью».
  • От структур нельзя наследоваться.
  • Структуры могут наследоваться только от интерфейсов.
  • Не разрешается дополнение своими свойствами;
  • При передаче структуры как параметра передается вся структура.
  • В структуре нельзя создать конструктор по умолчанию.
  • Структура уничтожается при выходе за пределы видимости.

В чем разница между структурами и классами?

Давайте выделим их главные отличия:

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

Boxing — UnBoxing

Упаковка представляет собой процесс преобразования структурного типа в тип object или любой другой тип интерфейса, реализуемый этим типом. Операция распаковки извлекает структурный тип из объекта.

static void Main()
{
int item = 10;
object obj = item; //упаковка переменно Boxing
int item2 = (int)obj //распаковка переменно UnBoxing
}

Упаковка(Boxing) — преобразование структурного типа(типа значения) в ссылочный тип (Object или любой другой тип интерфейса, реализуемый этим типом значения). Когда тип значения упаковывается средой CLR, она создает программу-оболочку значения внутри System.Object и сохраняет ее в управляемой куче.

Распаковка (Unboxing) — преобразование ссылочного типа в структурный тип. Операция распаковки-преобразования извлекает тип значения из объекта. Перед распаковкой среда выполнения проверяет совместимость между объектом и структурой, в которую будет происходить распаковка. Распаковка должна производиться только в тот тип, из которого производилась упаковка.

Обновлено: 12.02.2018 — 22:22

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.