Является ли тип значения боксом, когда это поле ссылочного типа? - PullRequest
3 голосов
/ 05 октября 2011

Существует код:

struct A
{
   int b;
}

class B
{
  A a;
  int b;
}

Вопросы:

  1. Является ли блок в B в штучной упаковке или нет?
  2. Находится ли блок B в стеке илив куче?
  3. Является ли b в A в штучной упаковке или нет?
  4. Является ли b в стеке A или в куче?
  5. В b находится в штучной упаковке или нет?
  6. Является ли b в стеке B или в куче?

Я действительно этого не понимаю: (

Ответы [ 5 ]

7 голосов
/ 05 октября 2011

1) Нет, здесь нет бокса.

2) a будет в куче, хотя это деталь реализации

3) Нет, b в A не в штучной упаковке

4) b в A будет жить там, где будет жить содержащий A (поэтому с локальной переменной типа A она обычно будет в стеке; с переменной экземпляра такого класса, как B или любая статическая переменная, она будет в куче); опять же, это деталь реализации

5) b в B тоже не в штучной упаковке

6) b в B будет в куче - снова деталь реализации

Здесь не происходит никакого бокса, поскольку вы не показали ничего, пытаясь использовать значение типа значения в качестве значения ссылочного типа (например, object или интерфейс).

Опять же, различие между стеком и кучей - это деталь реализации. Вам следует прочитать сообщения в блоге Эрика Липперта на тему .

2 голосов
/ 05 октября 2011

С помощью Google я нашел это :

Упаковка и распаковка является важной концепцией в системе типов C #. С помощью бокса и распаковки можно связывать между типами значений и ссылочными типами, позволяя преобразовывать любое значение типа значений в и от типа объекта. Упаковка и распаковка позволяет получить единое представление о системе типов, в которой значение любого Тип в конечном итоге может рассматриваться как объект. Преобразование типа значения в ссылочный тип называется боксом. Распаковка - это явная операция .

Бокс преобразует тип значения в ссылку, которого нет в вашем коде. Поэтому отвечайте на ваши вопросы в формате «b-boxed» «Нет».

1 голос
/ 05 октября 2011
  1. Элемент в B не упакован.
  2. Элемент в B находится в куче.Это часть объекта, и объекты всегда размещаются в куче.
  3. Член b в A не упакован (но значение A может быть в штучной упаковке).
  4. Член b в Aявляется частью A, поэтому хранится там, где хранится значение A, которое может находиться либо в стеке, либо в куче.
  5. Член b в B не упакован.
  6. The bчлен в B находится в куче, как часть объекта.
0 голосов
/ 27 февраля 2012

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

Бокс работает внутренне, определяя для каждого типа значения тип класса с тем же именем и членами. Когда значение типа значения присваивается коду, которому нужен тип класса, система создает новый экземпляр типа класса тезка и копирует все поля - публичные и частные - из значения типа значения в новый объект пример. Хотя спецификация C # описывает упакованный экземпляр как тип значения, его поведение и внутренняя работа будут такими же, как у класса.

0 голосов
/ 05 октября 2011

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

void SomeFunction(ref int a) а не в штучной упаковке.

int? value Обнуляемые типы значений также не упаковываются.

object my_box = my_integer my_value - это коробочная версия my_integer

Типы значений, содержащиеся в классах, не упакованы (когда это был бы тип значений, если бы это было так?)

...