Найти в Дзене
.Net Review

Значимые типы и ссылочные типы. Как это работает?

В C# типы данных делятся на 2 группы: ссылочные и значимые. Довольно частый вопрос на собеседовании. Подробнее о работе типов и специфике в этой статье. Как хранятся переменные? Данные хранятся в куче (heap) или стеке. Типы значений сохраняются там, где они объявлены. Например: значение int внутри функции, как локальной переменной будет храниться в стеке, тогда как значение int объявленное как член в классе, будет храниться в куче с классом, в котором он объявлен. Тип значения в классе имеет тип lifetype, который точно такой же, как класс, в котором он объявлен, требуя почти никакой работы сборщиком мусора. Для чего это сделано? Реализовано для того, чтобы уменьшить количество затрачиваемых ресурсов для переменных. Например, у вас есть класс и в нем значимые типы и они хранятся в стеке. Когда мы где-то используем класс, то нам нужно передать данные из одного места в другое. Если передать все данные класса из одного фрейма(часть кода в которой существуют ваши данные) в стеке, то это буд
Оглавление

В C# типы данных делятся на 2 группы: ссылочные и значимые. Довольно частый вопрос на собеседовании. Подробнее о работе типов и специфике в этой статье.

Как хранятся переменные?

Данные хранятся в куче (heap) или стеке.

Типы значений сохраняются там, где они объявлены. Например: значение int внутри функции, как локальной переменной будет храниться в стеке, тогда как значение int объявленное как член в классе, будет храниться в куче с классом, в котором он объявлен. Тип значения в классе имеет тип lifetype, который точно такой же, как класс, в котором он объявлен, требуя почти никакой работы сборщиком мусора.

Для чего это сделано?

-2

Реализовано для того, чтобы уменьшить количество затрачиваемых ресурсов для переменных. Например, у вас есть класс и в нем значимые типы и они хранятся в стеке. Когда мы где-то используем класс, то нам нужно передать данные из одного места в другое. Если передать все данные класса из одного фрейма(часть кода в которой существуют ваши данные) в стеке, то это будет затратно, поэтому удобнее и быстрее передать ссылку на этот объект, а в C# это представлено в виде передачи полноценной переменной. Однако это имеет свои недостатки.

Итог

Преимущества:

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

Недостатки:

  • Больше ссылок на работу при распределении и разыменованиях при чтении значения. Дополнительная перегрузка для сборщика мусора

Телеграмм канал: https://t.me/dotnetreview