(или как там было). Это называется «распаковка».

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

В C # что значит сидеть: «Box and UnBox»?

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

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

Спасибо!

 Chris Kimpton25 янв. 2011 г., 15:38
Также дубликатstackoverflow.com/questions/13055/...

Ответы на вопрос(3)

Типы значений такие как int, double, single

ReferenceTypes ArrayList List и многое, многое другое

Переменные типаТипы значений хранятся в стекеReferenceTyped переменные хранятся в куче

Переменные типаТипы значений хранить ЦЕННОСТЬReferenceTyped переменные хранят ссылку на значение

так что если вы копируетеТип значения переменная - естьреальная копия значения, но если вы копируетеReferenceType переменная - вы получитедополнительная ссылка в ту же переменную.

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

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

 Masoud23 окт. 2015 г., 05:33
msdn.microsoft.com/en-us/library/yz2be5wk.aspx Когда CLR упаковывает тип значения, он помещает значение в System.Object и сохраняет его в управляемой куче.
 Ben Voigt23 дек. 2014 г., 08:31
Ваш ответ делает универсальное утверждение о чем-то, что даже близко не является универсальным.
 Ben Voigt22 дек. 2014 г., 23:39
«Переменные типа ValueTypes хранятся в стеке» Нет, обычно нет. Они обычно хранятся внутри объекта ссылочного типа, живущего в куче.
 Pilgerstorfer Franz22 дек. 2014 г., 23:56
@BenVoigt в соответствии сБлог Эрика Липперта «В реализации Microsoft C # на настольном CLR типы значений хранятся в стеке, когда значение является локальной или временной переменной, которая не является закрытой локальной переменной лямбда-выражения или анонимного метода, а тело метода не является блок итератора, и джиттер выбирает не регистрировать значение "- так что я думаю, что мой ответ должен быть приемлемым

String) это не проблема, но для ValueType (int, DateTime, ..) это так.

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

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

Решение Вопроса

которое рассматривает внутреннюю среду Common Language Runtime.

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

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

Если вы не знаете, что такое стек (не обижайтесь), это область памяти, в которой хранятся локальные переменные в методе и адреса вызывающих функций, используемых для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, он ожидает, что его реальное значение будет в расположении кучи, указанном стеком.

 supercat27 февр. 2012 г., 22:01
Место хранения (параметр, переменная или поле) типа struct (value) хранит все свои данные в полях, которые хранятся в самом месте хранения. Автоматические переменные и параметры обычно хранятся в стеке; поля класса всегда хранятся в куче; Поля структуры хранятся в структуре, которая их содержит. В отличие от этого, единственное, что хранится в месте хранения ссылочного типа, - это либо ссылка на объект кучи, который фактически содержит данные, либо нулевая ссылка.

Ваш ответ на вопрос