Выделение памяти для массива - PullRequest
2 голосов
/ 21 июня 2011

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

Ответы [ 4 ]

3 голосов
/ 21 июня 2011

Бокс и распаковка . Также см. Здесь для информации, относящейся конкретно к массивам (частично вниз). Обратите внимание, что это для массивов объектов, массив типа значений (например, int[]) не имеет (не) бокса.

1 голос
/ 21 июня 2011

Посмотрите на этот вопрос:

Массивы, куча, стек и типы значений

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

Массивы типов значений не требуют упаковки или распаковки!

0 голосов
/ 21 июня 2011

Типы значений могут размещаться в стеке. Это может произойти, только если они находятся в параметрах или локальных переменных или полях другого типа значения.

Типы значений в массивах и поля в классах хранятся локально в массиве или классе, вместо того, чтобы хранить там указатель - типы значений приводят к увеличению доступа к локальной памяти (повышение производительности) и в случае массивов значение n сразу после значения n-1 в памяти, что не гарантируется объектами в массиве ссылочных типов (включая коробочные значения в массиве объектов - также нет гарантии непрерывности). В массивах ссылочных типов это ссылки, которые являются непрерывными.

0 голосов
/ 21 июня 2011

CLR специально обрабатывает массивы типов значений.Конечно, массив - это ссылочный тип, который размещается в куче, но значения типа значения встраиваются в запись кучи (не в стеке).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...