Вот как я предпочитаю думать об этом. Рассмотрим реализацию переменной, содержащей 32-битное целое число. При обращении как тип значения все значение вписывается в 32 бита хранилища. Вот что такое тип значения: в хранилище содержатся только биты, которые составляют значение, не более, не что иное.
Теперь рассмотрим реализацию переменной, содержащей ссылку на объект. Переменная содержит «ссылку», которая может быть реализована любым количеством способов. Это может быть дескриптор структуры сборщика мусора, или это может быть адрес на управляемой куче или что-то еще. Но это то, что позволяет вам найти объект. Это тип ссылки: хранилище, связанное с переменной ссылочного типа, содержит некоторые биты, которые позволяют ссылаться на объект.
Ясно, что эти две вещи совершенно разные.
Теперь предположим, что у вас есть переменная типа объекта, и вы хотите скопировать содержимое переменной типа int в нее. Как ты делаешь это? 32 бита, составляющие целое число, не являются одной из этих «ссылочных» вещей, это всего лишь ведро, содержащее 32 бита. Ссылки могут быть 64-битными указателями в управляемой куче или 32-битными дескрипторами в структуру данных сборщика мусора или любой другой реализацией, о которой вы можете думать, но 32-битное целое число может быть только 32-битным целым числом.
Итак, что вы делаете в этом сценарии, вы вставляете целое число: вы создаете новый объект, который содержит память для целого числа, а затем вы храните ссылку на новый объект.
Бокс необходим только в том случае, если вы хотите (1) иметь систему унифицированного типа и (2) обеспечить, чтобы 32-разрядное целое потребляло 32 бит памяти. Если вы готовы отказаться от любого из них, вам не нужен бокс; мы не хотим их отвергать, и поэтому бокс - это то, с чем мы вынуждены жить.
+1 к вам, потому что вы объясняете это намного лучше меня .. –
Спасибо Мехридаду! Это очистило мое сомнение! :) –
Хороший ответ. Пара второстепенных проблем с ним. Во-первых, стек против кучи не имеет отношения к боксу; типы значений не обязательно должны находиться в стеке, и они помещаются в коробку, даже если они находятся в куче. Во-вторых, виртуальные методы не имеют значения; бокс никогда не нужен для отправки виртуального метода в структуру! Поскольку все структуры запечатаны, джиттер имеет достаточную информацию, чтобы точно определить, какой метод вызывается в jit time. –