Как массив типов значений хранится в куче объектов .NET? - PullRequest
4 голосов
/ 23 февраля 2011

В .NET объект типа Value, такой как int, хранится в памяти.

Объект ссылочного типа требует отдельного выделения памяти для ссылки и объекта, и объект хранится в куче объектов .NET.

А Array создается в куче, так как массив типов значений, таких как int [], хранится в куче? Значит ли это, что объект типа значения может храниться в куче без упаковки?

Ответы [ 4 ]

6 голосов
/ 23 февраля 2011

Да, вы правы.Я предлагаю вам прочитать это:

http://blogs.msdn.com/b/ericlippert/archive/2010/09/30/the-truth-about-value-types.aspx

Это очень очень хорошо и объясняет почти все, что вы когда-либо захотите узнать.

4 голосов
/ 23 февраля 2011

Да, массив - это one способ, которым значение типа значения может быть сохранено в куче без упаковки. Другой просто имеет его в обычном классе:

public class Foo
{
    int value1;
    string name;
    // etc
}

Все переменные, связанные с экземпляром Foo, хранятся в куче. Значение value1 является просто int, тогда как значение name является ссылкой на строку.

Вот почему утверждение о том, что «типы значений хранятся в стеке, ссылочные типы хранятся в куче», очевидно, неверно.

Однако, поскольку Эрик Липперт справедливо любит указывать , различие между стеком и кучей - это деталь реализации. Например, будущая версия CLR может хранить некоторые объекты в стеке, если удастся выяснить, что они не понадобятся после завершения метода.

0 голосов
/ 23 февраля 2011

Подумайте об этом так, местоположение объекта в памяти определяется тем, какой это тип и где он был объявлен.Если объект является типом значения, его значение сохраняется там, где вы объявили переменную.Если объект является ссылочным типом, его ссылка сохраняется там, где вы объявили переменную, в то время как фактический экземпляр объекта существует в куче.

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

Если вы объявляете переменную экземпляра в классе (ссылочный тип), вы фактически объявляете переменные экземпляра вкуча.Значение типа значения будет в куче (в экземпляре объекта).Ссылка на ссылочный тип также будет в куче (в экземпляре объекта), экземпляр объекта будет в другом месте в куче.

Если вы объявляете переменную экземпляра в структуре (тип значения), где онаresides зависит от того, где была объявлена ​​базовая структура.

В случае массива типа int int[] массивы являются ссылочными типами, и вы можете думать о значениях int, объявленных как "поля" для этого типа.так что ваши целые числа находятся в куче.

0 голосов
/ 23 февраля 2011

Да, это означает, что для элемента досягаемости не производится упаковка, потому что весь массив в целом"упакован" внутри объекта Array (хотя это не так, как он называется).

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

  1. Обернув его внутри обычного объекта.

  2. Упаковав его в коробку.

  3. Оборачивая его внутри объекта массива.

(Там может быть других способов, но я не думаю, что япропустил.)

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