Бокс преобразует тип значения в тип объекта. Или, как указывает MSDN, бокс - это "операция для обертывания структуры внутри объекта ссылочного типа в управляемой куче".
Но если вы попытаетесь разобраться в этом, посмотрев код IL, вы увидите только "волшебное слово".
Спекулируя, я предполагаю, что среда выполнения имеет своего рода секретный класс на основе дженериков в своем рукаве, например Box<T>
с свойством public T Value
, а бокс int будет выглядеть так:
int i = 5;
Box<int> box = new Box<int>;
box.Value = 5;
Unboxing int будет намного дешевле: return box.Value;
К сожалению, мое приложение, зависящее от производительности, выполняет честный бит бокса, в частности десятичных знаков. Хуже того, эти коробочки недолговечны, что заставляет меня подозревать, что я плачу дважды, один раз за то, чтобы стимулировать коробку, а затем снова за сбор мусора, после того как я закончил с ним.
Если бы я сам использовал эту память, я бы рассмотрел использование пула объектов здесь. Но так как фактическое создание объекта скрыто за волшебным словом в IL, каковы мои варианты?
Мои конкретные вопросы:
- Существует ли существующий механизм для того, чтобы заставить среду выполнения принимать поля из пула, а не запускать их?
- Каков тип экземпляра, созданного во время бокса? Можно ли вручную взять под контроль процесс бокса, но все же быть совместимым с распаковкой?
Если этот последний вопрос кажется странным, я имею в виду, что я мог бы создать свой собственный класс Box<T>
или DecimalBox
, объединить его и box/unbox вручную. Но я не хочу идти и изменять различные места в коде, которые потребляют значение в коробке (aka unbox it).