Что такое boxing и unboxing в C#, каковы их плюсы и минусы?
Что проверяют
Понимаете ли вы разницу между значимыми и ссылочными типами на уровне памяти и видите ли скрытую упаковку в чужом коде. Вопрос сформулирован про плюсы и минусы, но ценность ответа в умении назвать конкретные места, где boxing случается сам.
Как отвечать
Boxing это оборачивание значения в объект на управляемой куче, чтобы его можно было положить в переменную типа object или в интерфейсную ссылку. Unboxing это обратная операция: проверка типа и копирование значения из кучи обратно.
int n = 123;
object boxed = n; // упаковка: аллокация в куче и копия значения
int back = (int)boxed; // распаковка: проверка типа и копированиеЦена упаковки: аллокация, работа сборщику мусора, потеря локальности, лишнее копирование. Выигрыш ровно один: единообразная работа со значимыми и ссылочными типами там, где обобщения недоступны, например в старых нетипизированных коллекциях.
Отдельно перечислите незаметные места. Значение кладут в нетипизированную коллекцию. Структуру приводят к интерфейсу. Вызывают не переопределённый Equals, GetHashCode или ToString у структуры. Передают значение как object в форматирование строки или в метод логирования со свободной сигнатурой. Сравнивают через необобщённый интерфейс сравнения.
Как не платить: обобщения вместо object, реализация обобщённых интерфейсов равенства и сравнения у структур, обобщённые перегрузки логгера, Span и ссылочная передача в горячем коде.
Где спотыкаются
Говорят, что распаковка тоже выделяет память. Аллокация происходит только при упаковке, распаковка это проверка типа и копирование значения, новых объектов она не создаёт.
Распаковывают в «совместимый» тип. Упакованное целое нельзя распаковать сразу в число другого размера или в вещественное, будет исключение приведения типа: сначала распаковка в точный исходный тип, потом обычное преобразование.
Считают проблему историей про старые коллекции. Обобщения убрали самый массовый случай, но структура, приведённая к интерфейсу, и значения в форматировании строк пакуются и сегодня, а на горячем пути это видно в профиле по числу сборок мусора.