Вопрос

Возможные дубликаты:
Зачем нам нужен бокс и распаковка в C#?
Что такое бокс и распаковка и каковы обмен?

В C# Что Do Sit означает: «Box и Unbox»?

Здесь выдержка из MSDN, где я основал текст.

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

Спасибо!

Это было полезно?

Решение

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

Во -первых, давайте изменим разницу между Типы значений а также ссылочные типы:

  • Тип стоимости проводится на куча и его копия передается на называемые методы
  • Справочная стоимость хранятся в Управляемая куча и стек содержит только указатель (ссылка) на его местоположение. Место, а не объект, передается на называемые методы

Если вы не знаете, что стой return инструкция (просто чтобы быть кратким и дать общий ответ). Когда вы называете метод, достаточная область в стеке статически Выдвинуто на это, поэтому распределение стека всегда называется статическим распределением.

Вместо этого куча представляет собой область памяти, отделенная от стека, имущество процесса выполнения, в котором распределение должно быть сначала требуется в операционной системе, и именно поэтому оно называется динамическое распределение (Если вы не запускаете оператор IF, например, память не может быть выделена для вашего процесса, вместо этого всегда выделяется стек).

Просто чтобы сделать окончательный пример на куче и стеке: на таких языках, как C ++, объявляя int[100] a; Статически выделяет 100*8 байтов на стек (предполагается 64-битная система), в то время как int* a = new int[100]; Объявляет область 8 байт (на 64-битных системах) в стеке и запрашивает еще 800 байтов на куче, если и где доступно.

А теперь поговорим о C#:

Заниматься боксом

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

Распаковка

Прямо наоборот: когда у вас есть ссылочный тип, такой как объект, и вы хотите поднять его на тип значения, например, к INT, новое значение должно содержаться в стеке, поэтому CLR идет в кучу, ООН-ящики Значение и копирует его в стек.

Другими словами

Помните int[] а также int* Примеры? Просто, когда у вас есть int В C#во время выполнения ожидает его местоположение стека удерживайте значение Но вместо этого, когда у вас есть object, он ожидает, что его реальное значение окажется в расположении кучи, указанном стеком.

Другие советы

Есть два разных типа в .NET Framework.

ValueTypesтакие как int, двойной, одинокий

СсылкиСписок ArrayList и многие, многое другое

Переменные типа ValueTypes хранятся в стекеСсылка переменные хранятся в куче

Переменные типа ValueTypes хранить значениеСсылка Переменные хранят ссылку на значение

Так что, если вы скопируете Тип значения переменная - есть настоящая копия значения, но если вы копируете Ссылка переменная - вы получите Дополнительная ссылка к той же переменной.

Бокс в вашем вопросе означает, что переменная ValueType (например, Int) будет обрабатываться, понравилась переменная ссылочного типа - .NET придает ее в новую коробка. Анкет Таким образом, он будет инкапсулирован в кучу, и на нее будут ссылки (ы).

Если вы хотите, чтобы значение было снова в переменной Valuetype, вам нужно рассеянный Это (выньте это из коробки). Таким образом, значение будет выведено из кучи - и сохранится/приведено в стек еще раз.

ArrayList хранит только объекты. Для опорного типа (как String) это не проблема, но для ValueType (int, dateTime, ..) Это так.

Эти оценки необходимо преобразовать в объект, прежде чем вы сможете хранить их в виде простого объекта. Это «преобразование в объект» называется «бокс» и занимает немного времени.

Когда вы читаете значение обратно, вам нужно преобразовать из объекта в int (или что бы это ни было). Это называется «распаковка».

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top